为啥在 OpenCV Python 中按位发送错误?

Posted

技术标签:

【中文标题】为啥在 OpenCV Python 中按位发送错误?【英文标题】:Why bitwise and send error in OpenCV Python?为什么在 OpenCV Python 中按位发送错误? 【发布时间】:2020-03-24 14:04:51 【问题描述】:

我正在尝试在第一张图片上传递我的第二张图片的蒙版。

我收到以下错误:

cv2.error: OpenCV(4.2.0) /io/opencv/modules/core/src/arithm.cpp:250: error: (-215:Assertion failed) (mtype == CV_8U || mtype == CV_8S) && _mask.sameSize(*psrc1) in function 'binary_op'

我遵循本教程:https://theailearner.com/tag/cv2-addweighted/ 并遇到另一个错误。

代码:

listFileEtiFinal = getImagesRGB("ImgResult","ETIFinal.png") + getImagesRGB("ImgEtiSelect","ETIFinal.png")
listFileEti = getImagesRGB("ImgResult","ETI.png") + getImagesRGB("ImgEtiSelect","ETI.png")

for fileImgF in listFileEtiFinal:
    for fileImgG in listFileEti:
            dos = fileImgF[0] + "/"
            fileEti = fileImgF[1]
            dosTwo = fileImgG[0] + "/"
            fileEtiG = fileImgG[1]
            nb = int(re.findall('\d+', fileEti)[0])
            img = cv2.imread(dos + fileEti)
            img2 = cv2.imread(dos + fileEtiG)
            img_gauss = cv2.GaussianBlur(img2, ksize=(11,11),sigmaX=5)
            _, img_gauss_th = cv2.threshold(img_gauss, thresh=243, maxval=255, type=cv2.THRESH_BINARY)
            img2gray = cv2.cvtColor(img_gauss_th,cv2.COLOR_BGR2GRAY)
            _, mask = cv2.threshold(img2, 200, 255, cv2.THRESH_BINARY_INV)
            mask_inv = cv2.bitwise_not(mask)
            rows,cols,_ = img2.shape
            roi = img[0:rows, 0:cols ]
            img1_bg = cv2.bitwise_and(roi,roi,mask = mask_inv)
            img2_fg = cv2.bitwise_and(roi,roi,mask = mask)  
            out_img = cv2.add(img1_bg,img2_fg)
            img[0:rows, 0:cols ] = out_img
            cv2.imwrite(dos + img , out_img)

【问题讨论】:

您是否验证了断言条件是否得到满足?看起来掩码类型应该是CV_8UCV_8S,并且掩码应该与源图像大小相同。 【参考方案1】:

根据cv2.bitwise_and,mask必须是单通道数组

ma​​sk – 可选操作掩码,8 位单通道数组,指定要更改的输出数组的元素。

您发布的代码使用具有 3 个通道的掩码。 您可以查看mask_inv.shapemask.shape

你只能使用一个通道的面具(仅用于测试):

img1_bg = cv2.bitwise_and(roi,roi,mask=mask_inv[:,:,0])
img2_fg = cv2.bitwise_and(roi,roi,mask=mask[:,:,0])

或者更好,在阈值之前将图像转换为灰度:

_, mask = cv2.threshold(cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY), 200, 255, cv2.THRESH_BINARY_INV)

【讨论】:

【参考方案2】:

并使用 numpy 使两张图片的大小相同 例如: 第一,第二=第一[0:x,0:y,:],第二[0:x,0:y,:] 然后 删除掩码类型,它不是主要回答,而是暂时回答...

img1_bg = cv2.bitwise_and(roi,roi)

img2_fg = cv2.bitwise_and(roi,roi)

【讨论】:

以上是关于为啥在 OpenCV Python 中按位发送错误?的主要内容,如果未能解决你的问题,请参考以下文章

python-opencv-图像的按位运算

opencv python 孔洞填充算法

使用Python,OpenCV进行按位ANDORXOR和NOT

AI基础python:openCV——图像算术运算:按位运算

é 如何在 C++ 中按位移动到 E?

C中按位运算的模运算