[英]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.