OpenCV:常见问题汇总(一)

一、前言

        最近和一些新学OpenCV的网友有所交流,然后有些网友也会问我一些使用OpenCV上的问题。可能大家使用的教材或者教材使用的OpenCV的版本和我们使用的不同导致出些小错误。个人觉得这个是很正常的,毕竟IT这个行业的知识更新得太快,书籍的的知识多多少少都有些滞后,所以我打算在博客不定期更新一波大家可能遇到的问题。(本人使用的OpenCV的版本是4.x)

二、常见问题汇总

1、读取并显示图片出现闪退的问题

a=cv2.imread('hmj.bmp')
cv2.namedWindow('lesson')
cv2.imshow('lesson',a)
# cv.waitKey(0)
# cv.destroyAllWindows()

    嗯..........网友说这样会出现闪退,其实我开始学OpenCV的时候都是要加上后面被注释掉的代码的。那么,我来简单讲下后面两行代码的作用。cv.waitKey()是一个键盘绑定函数,其参数是以毫秒为单位的时间。如果没有执行关闭操作的话,这图片就好一直显示。cv.destroyAllWindows()只会破坏我们创建的所有窗口。

2、脸部打码失败

import cv2
import numpy as np
a=cv2.imread('hmj.bmp',cv2.IMREAD_UNCHANGED)
cv2.imshow('original',a)
cv2.waitKey()
face=np.random.randint(0,256,size=[180,100,3],dtype=np.uint8)
a[200:600,300:600]=face
cv2.imshow('result',a)
cv2.waitKey()
cv2.destroyAllWindows()

       这个代码不能成功实现打码的功能,会出现报错。出现错误,我们首要肯定是看报错提示,接下来我们看下报错内容。

  File "G:/python/training_two/opencv/opencv_first.py", line 195, in <module>
    a[200:600,300:600]=face
ValueError: could not broadcast input array from shape (180,100,3) into shape (400,300,3)

这个错误是指我们这个马赛克的大小(180,100,3)的维度并不能通过numpy的广播机制将其扩展为大小为(400,300,3)的维度,首先,思考下为什么一定是扩展到(400,300,3)呢?因为a[200:600,300:600]=face这行代码的意思是在原图片像素在(600-200:,600-300)=(400,300)这样大的地方打上马赛克的,所以这样赋值是不对的。为什么会提到不能广播呢,因为按照numpy的广播机制并不能进行扩展到(400,300)的维度。所以正确代码如下:

import cv2
import numpy as np
a=cv2.imread('hmj.bmp',cv2.IMREAD_UNCHANGED)
cv2.imshow('original',a)
cv2.waitKey()
face=np.random.randint(0,256,size=[400,300,3],dtype=np.uint8)
a[200:600,300:600]=face
cv2.imshow('result',a)
cv2.waitKey()
cv2.destroyAllWindows()

3.图像融合操作报错

img1 = cv.imread('ml.png')
img2 = cv.imread('opencv-logo.png')
dst = cv.addWeighted(img1,0.7,img2,0.3,0)
cv.imshow('dst',dst)
cv.waitKey(0)
cv.destroyAllWindows()

  报错原因:

cv2.error: C:\projects\opencv-python\opencv\modules\core\src\arithm.cpp:659: error: (-209) The operation is neither 'array op array' (where arrays have the same size and the same number of channels), nor 'array op scalar', nor 'scalar op array' in function cv::arithm_op

我们简单看下报错原因,说是图像融合这个方法错了,再结合报错的英文,说array数组的大小no same,就是说两个对象(图片)大小不一致的意思,我们现在把图片的大小改为大小一致即可。代码的语法本身并没有什么错误。

 4.掩模图像操作出错

import cv2
import numpy as np
a=cv2.imread('hmj.bmp',1)
w,h,c=a.shape
mask=np.zeros((w,h),dtype=np.uint8)
mask[100:400,200:400]=255
mask[100:500,100:200]=255
c=cv2.bitwise_and(a,a,mask)
print('a.shape=',a.shape)
print('mask.shape=',mask.shape)
cv2.imshow('a',a)
cv2.imshow('mask',mask)
cv2.imshow('c',c)
cv2.waitKey()
cv2.destroyAllWindows()

这个代码想要实现如下的效果:

 但是呢,实际是残酷的,这个即不实现如愿的效果,也不报错。但是我观察了下实现的效果中,左边和中间的效果是可以实现的,但是右边那个效果无法实现,那多半就是c=cv2.bitwise_and(a,a,mask)一行代码的问题了,然后我就去看了下官方代码中cv2.bitwise_and(img1,img2,mask=mask)的三个参数,就随便试了下,将原代码改成c=cv2.bitwise_and(a,a,mask=mask)就实现了,好吧,就是这样。

目前的问题就先统计到这里,大家如果有遇到其他问题及其解决方法的话,可以在文末留言,大家一同进步。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值