[英]Can't get image registration with OpenCV 4.0.0 and Python 3.7 to work
我正在尝试使用来自 Python 3.7 的 OpenCV 4.0.0 的图像注册模块。 我定义了一个普通图像 m1 和一个移动版本 m2。 然后我尝试使用 cv2.reg_MapperGradShift( ) 以及 cv2.reg_MapperPyramid( ) 和 cv2.reg_MapperGradShift( ) 的组合找到偏移
m1 = numpy.zeros( ( 10, 10 ) )
m1[ 3, 3 ] = 1
m2 = numpy.zeros( ( 10, 10 ) )
m2[ 3, 6 ] = 1
t1 = cv2.reg_MapperGradShift( )
t2 = t1.calculate( m1, m2 )
t3 = cv2.reg.MapTypeCaster_toShift( t2 )
t4 = t3.getShift( )
print( t4 )
t5 = cv2.reg_MapperPyramid( t1 )
t6 = t5.calculate( m1, m2 )
t7 = cv2.reg.MapTypeCaster_toShift( t6 )
t8 = t7.getShift( )
print( t8 )
结果是
[[0.]
[0.]]
[[9.11379962]
[6.47128924]]
我怎样才能让它找到合适的班次?
此外,当我尝试在 2 张不同尺寸的图像上运行计算()时,我得到
cv2.error: OpenCV(4.0.0) C:\\projects\\opencv-python\\opencv\\modules\\core\\src\\arithm.cpp:663: error: (-209:Sizes of input arguments do not match) 操作是函数“cv::arithm_op”中既不是“array op array”(其中数组具有相同的大小和相同数量的通道),也不是“array op scalar”,也不是“scalar op array”
难道不能注册不同尺寸的图像(在较大的图像中找到较小的图像)吗?
编辑:我又玩了一些,我发现当我定义更大的图像并在中间的某个地方设置一个像素时,我用 cv2.reg_MapperPyramid() 得到了正确的答案,但是当我在边界附近设置一个像素时,我仍然得到错误的答案。 例如
m1 = numpy.zeros( ( 100, 100 ) )
m1[ 30, 30 ] = 1
m2 = numpy.zeros( ( 100, 100 ) )
m2[ 30, 33 ] = 1
t1 = cv2.reg_MapperGradShift( )
t2 = t1.calculate( m1, m2 )
t3 = cv2.reg.MapTypeCaster_toShift( t2 )
t4 = t3.getShift( )
print( t4 )
t5 = cv2.reg_MapperPyramid( t1 )
t6 = t5.calculate( m1, m2 )
t7 = cv2.reg.MapTypeCaster_toShift( t6 )
t8 = t7.getShift( )
print( t8 )
结果是
[[0.]
[0.]]
[[3.02103606]
[0. ]]
是否与注册模块如何推断图像(其他函数中使用的 borderMode 或 borderType 参数)有关?
您需要将图像的数据类型从 int 更改为 float32 或 float64。 如果你不这样做,它就不起作用。
您应该使用matchTemplate ,它允许您在图像中找到模板。 例如,如果您的模板是
你的形象是
结果将是
(图像可以在 OpenCV 文档中找到)
根据您的需要,您可以选择一种或另一种方法,例如,TM_CCORR_NORMED 是健壮的,但 TM_SQDIFF 需要较少的计算。
更新
它很容易用于翻译,但对于更复杂的转换,您应该使用Features2D 和单应性来查找模板。 这是 OpenCV 文档示例:
算法思想是:
提取每个图像中的关键点,然后匹配描述符。
也许这也应该有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.