python - 如何将 warp_matrix(来自 cv2.findTransformECC)与 cv2.transform 一起使用
问题描述
我有一个由点数组定义的形状 [[x1,y1],[x2,y2],...,[xn,yn]] 和一个带有(几乎)的图像(img1),我需要找到这个形状在哪里,我的意思是如果在图像(img2)上的任意位置绘制这个形状,我发现仿射变换从img1到img2。我设法做到了这个 cv2.findTransformECC。我得到一个warp_matrix。
[img1] https://i.imgur.com/097V8YM.png [img2] https://i.imgur.com/dNUrgE8.png
编码 :
def get_gradient(im) :
# Calculate the x and y gradients using Sobel operator
grad_x = cv2.Sobel(im,cv2.CV_32F,1,0,ksize=3)
grad_y = cv2.Sobel(im,cv2.CV_32F,0,1,ksize=3)
# Combine the two gradients
grad = cv2.addWeighted(np.absolute(grad_x), 0.5, np.absolute(grad_y), 0.5, 0)
return grad
img1=cv2.imread('img1.png',0)
points=np.array([[ 834, 429],
[ 867, 419],
[ 900, 409],
[ 934, 400],
[ 967, 391],
[1001, 382],
[1035, 375],
[1069, 369],
[1102, 364],
[1136, 361],
[1170, 361],
[1204, 362],
[1238, 365],
[1272, 370],
[1306, 376],
[1340, 385]])
img2=np.zeros_like(img1)
cv2.polylines(img2,[points],False,255,4)
warp_mode = cv2.MOTION_AFFINE
warp_matrix = np.eye(2, 3, dtype=np.float32)
criteria = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 3000, 1e-5)
(cc, warp_matrix) = cv2.findTransformECC (get_gradient(img1), get_gradient(img2),warp_matrix, warp_mode, criteria)
img3 = cv2.warpAffine(img2, warp_matrix, (img1.shape[1],img1.shape[0]), flags=cv2.INTER_LINEAR + cv2.WARP_INVERSE_MAP)
结果:[img3] https://i.imgur.com/zCXJoyJ.png
然后我想直接在我尝试使用 cv2.transform 的好位置绘制形状,但我的工作很奇怪,好像旋转角度与坏标志一起使用。
以下代码是我的问题,请参阅 img4 中的结果:
warp_points=cv2.transform(np.reshape(points,(points.shape[0],1,2)),warp_matrix)
img4=img1.copy()
cv2.polylines(img4,[warp_points],False,100,4) #100 : gray
[img4] https://i.imgur.com/JvUHBVK.png
提前谢谢,(抱歉任何英语错误,这不是我的妈妈)
解决方案
尝试在转换图像时使用的 cv2.findTransformECC 函数中交换图像的顺序,并使用新的扭曲矩阵来转换点。在浏览 opencv 文档后,还可以尝试更改与 cv2.findTransformECC 的“标准”属性关联的值。我相信这些会有所帮助,因为我过去也遇到过类似的问题。
推荐阅读
- java - Spring Boot 无法从 MySQL 数据库中获取和显示数据
- c# - 如何将 int 传递给接受“ref object”的函数
- javascript - 用复选框替换特殊字符
- html - 如何在不扩大磁贴大小的情况下让我的标题打破并显示椭圆?
- froala - 在 Froala 3.0.3 中,我如何访问全局 Froala 对象
- python - python代码中空循环的要求是什么?如果我们在其中使用“pass”关键字,我们可以使用函数或循环吗
- bootstrap-4 - 下拉菜单宽度太大
- batch-file - 为什么调用批处理文件后的错误处理无法在我的批处理文件中按预期工作?
- c# - Visual Studio 调试问题 - 调试器指向不相关的代码
- c# - FTP文件下载C#