给定一个图像和一组点(点数> = 3),这组点将形成一个多边形,这是我感兴趣的区域,我的目的是过滤此图像之外的所有内容感兴趣的区域,而它内部的区域没有受到影响。
例如,给定大小为712 x 480 px
的图像和点
[[120,160]
[100,130]
[120,100]
[140,130]]
我所做的是
#Create an array of object rect which represents the region of interest
rect = [[120,160], [100,130], [120,100],[140,130]]
mask = np.array([rect], dtype=np.int32)
#Create a new array filled with zeros, size equal to size of the image to be filtered
image2 = np.zeros((480, 712), np.int8)
cv2.fillPoly(image2, [mask],255)
在此步骤之后,image2
将是一个到处为0的数组,除了位置与我感兴趣的区域完全相同的区域。在这一步之后我做的是:
output = cv2.bitwise_and(image, image2)
image
这是我的输入图片。我收到这个错误:
cv2.error: ..\..\..\..\opencv\modules\core\src\arithm.cpp:1021: error: (-209) The operation is neither 'array op array' (where arrays have the same size and type), nor 'array op scalar', nor 'scalar op array' in function cv::binary_op
我真的不明白我在这里做错了什么。另外,我的问题还有其他解决办法吗?我仍然是opencv的新手,并且在我去的时候仍然在学习一切。如果有更好的方法/库使用请建议。谢谢!
答案 0 :(得分:3)
我刚刚找到了解决问题的方法。所以不要写这个
output = cv2.bitwise_and(image, image2)
我首先将image2
转换为二进制掩码,然后使用原始图像bitwise_and
。所以代码应该是这样的
maskimage2 = cv2.inRange(image2, 1, 255)
out = cv2.bitwise_and(image, image, mask=maskimage2)
这样做会使感兴趣区域之外的所有内容都具有二进制值0.如果您发现任何缺陷,请发表评论。