当我从命令行运行sift.detectAndCompute时,我可以从两个单独的大图像(〜2GB)中获取SIFT关键点和描述符。我在一张图像上运行它,等待了很长时间,但最终获得了关键点和描述符。然后,我重复第二张图像,这又花费了很长时间,但最终我确实得到了关键点和描述符。这是我从Spyder的IPython控制台运行的两行代码,它们在具有32 GB RAM的计算机上运行。 (下面的代码中MAX_MATCHES = 50000):
sift = cv2.xfeatures2d.SIFT_create(MAX_MATCHES)
keypoints, descriptors = sift.detectAndCompute(imgGray, None)
这需要10分钟才能完成,但确实可以完成。接下来,我运行这个:
keypoints2, descriptors2 = sift.detectAndCompute(refimgGray, None)
完成后,关键点和关键点2确实包含50000个关键点对象。
但是,如果我运行脚本,该脚本调用使用sift.detectAndCompute的函数并返回关键点和描述符,则该过程将花费很长时间,使用100%的内存和〜95%的磁盘带宽,然后失败具有此回溯:
runfile('C:/AV GIS/python scripts/img_align_w_geo_w_mask_refactor_ret_1.py', wdir='C:/AV GIS/python scripts')
Reading reference image : C:\Users\kellett\Downloads\3074_transparent_mosaic_group1.tif
xfrm for image = (584505.1165100001, 0.027370000000000002, 0.0, 4559649.608440001, 0.0, -0.027370000000000002)
Reading image to align : C:\Users\kellett\Downloads\3071_transparent_mosaic_group1.tif
xfrm for image = (584499.92168, 0.02791, 0.0, 4559648.80372, 0.0, -0.02791)
Traceback (most recent call last):
File "<ipython-input-75-571660ddab7f>", line 1, in <module>
runfile('C:/AV GIS/python scripts/img_align_w_geo_w_mask_refactor_ret_1.py', wdir='C:/AV GIS/python scripts')
File "C:\Users\kellett\AppData\Local\Continuum\anaconda3\envs\testgdal\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 668, in runfile
execfile(filename, namespace)
File "C:\Users\kellett\AppData\Local\Continuum\anaconda3\envs\testgdal\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 108, in execfile
exec(compile(f.read(), filename, 'exec'), namespace)
File "C:/AV GIS/python scripts/img_align_w_geo_w_mask_refactor_ret_1.py", line 445, in <module>
matches = find_matches(refKP, refDesc, imgKP, imgDesc)
File "C:/AV GIS/python scripts/img_align_w_geo_w_mask_refactor_ret_1.py", line 301, in find_matches
matches = matcher.match(dsc1, dsc2)
error: C:\ci\opencv_1512688052760\work\modules\core\src\stat.cpp:4024: error: (-215) (type == 0 && dtype == 4) || dtype == 5 in function cv::batchDistance
因此,只需为每个图像调用一次该函数:
print("Reading image to align : ", imFilename);
img, imgGray, imgEdgmask, imgXfrm, imgGeoInfo = read_ortho4align(imFilename)
refKP, refDesc = extractKeypoints(refimgGray, refEdgmask)
imgKP, imgDesc = extractKeypoints(imgGray, imgEdgmask)
这是我的问题(很抱歉):您认为Python尝试以某种方式同时运行以上两行吗?如果是这样,我如何强制它连续运行?如果不是,您是否知道为什么两个关键点检测将单独起作用,而在脚本中一个接一个出现时却不起作用?
另一个线索-我放入一条语句,以查看脚本在失败之前是否继续执行第二个detectAndCompute语句,并且确实如此。 (我只是在两者之间添加了打印语句。)
答案 0 :(得分:0)
我的错误稍后在我找到匹配项的脚本中出现。
我没有理由相信两个SIFT关键点查找过程是同时发生的。
我对正在搜索SIFT关键点的图像进行了下采样,并且能够更快地进行故障排除并发现了错误。
下一次问问题之前,我将仔细检查我的错误。