如何在OpenCV Python的Stitcher类中设置扫描模式?
解决OpenCV Python中Stitcher切换到Scans模式的问题
嘿,我来帮你搞定这个OpenCV Stitcher模式切换的问题!你遇到的情况确实是因为旧版本OpenCV的Python绑定没有完全暴露Scans模式的创建接口,下面给你两种可行的解决方案:
方案1:升级到OpenCV 4.x及以上版本(推荐)
在OpenCV 4之后,Python API做了更新,不仅弃用了旧的cv2.createStitcher(),还新增了直接指定模式的参数。你可以用cv2.Stitcher_create()来创建指定模式的拼接器,代码示例如下:
import cv2 # 创建Scans模式的拼接器,第二个参数可选,指定是否启用GPU stitcher = cv2.Stitcher_create(cv2.Stitcher_SCANS, False) # 读取图片 foo = cv2.imread("D:/foo.png") bar = cv2.imread("D:/bar.png") # 执行拼接,返回状态码和结果图 status, result = stitcher.stitch((foo, bar)) # 检查拼接是否成功 if status == cv2.Stitcher_OK: cv2.imwrite("D:/result.jpg", result) else: print(f"拼接失败,状态码:{status}")
这里的cv2.Stitcher_SCANS就是对应C++里的Stitcher::SCANS模式,直接传入即可。升级版本是最省心的方式,还能获得OpenCV的新特性和bug修复。
方案2:修改OpenCV源码并重新编译(适合无法升级的场景)
如果你必须使用旧版本(比如3.x),那需要手动修改OpenCV的Python绑定代码,添加createStitcherScans的接口:
- 找到OpenCV源码中
modules/stitching/python/src2/stitching.cpp文件(不同版本路径可能略有差异) - 添加以下函数实现:
static PyObject* pycv_createStitcherScans(PyObject* , PyObject* args, PyObject* kw) { int try_use_gpu = 0; const char* keywords[] = {"try_use_gpu", NULL}; if (!PyArg_ParseTupleAndKeywords(args, kw, "|i", (char**)keywords, &try_use_gpu)) return NULL; cv::Ptr<cv::Stitcher> stitcher = cv::Stitcher::create(cv::Stitcher::SCANS, try_use_gpu != 0); return pyopencv_from(stitcher); }
- 在
stitching_methods方法列表中注册这个新函数:
static PyMethodDef stitching_methods[] = { {"createStitcher", (PyCFunction)pycv_createStitcher, METH_VARARGS | METH_KEYWORDS, pycv_createStitcher_doc}, {"createStitcherScans", (PyCFunction)pycv_createStitcherScans, METH_VARARGS | METH_KEYWORDS, "Create Stitcher instance in SCANS mode."}, {NULL, NULL, 0, NULL} };
- 用CMake重新配置并编译OpenCV,编译完成后安装新的版本,之后就能在Python中调用
cv2.createStitcherScans(False)了。
注意:这种方法需要你具备编译OpenCV的环境(比如CMake、Visual Studio/GCC等),操作相对繁琐,所以优先推荐升级版本。
内容的提问来源于stack exchange,提问作者user6068326
相关产品推荐
相关产品推荐

