第一次使用opencv,遇到了很多问题,记录一下
安装问题
代理
由于pip使用了代理而电脑代理没开,导致pip install opencv-python时一直报错连接不上代理
解决办法:
- 使用pip install -i <清华源>
- 开启代理
无法引入jar包
安装完成后在交互模式可以正常使用
输入python
import cv2
不报错就说明正常安装了
但是在jupyter notebook 中引入一直报错,找不到cv2模块
经过百度后,测试如下
在交互模式下输入如下命令查看python环境
import sys
sys.executable
这是anaconda下的一个虚拟环境,没有问题
再在jupyter notebook下输入同样的命令,查看python环境,发现竟然不是上述环境
而是 anaconda3/share下的环境
至此,就查询到了问题的原因:
jupyter notebook 是anaconda的公共包
进入虚拟环境后 pip install jupyter 再次启动jupyter notebooke 就正常了
使用opencv及原理
使用opencv换照片底色的原理很简单
- 读取照片
- 将照片转换为灰度图
- 提取灰度图底色的BGR上下边界
- 使用opencv转换背景底色的BGR值(第三步已经获取了背景色的上下边界,边界之中的所有颜色都会被转换为255,边界之外的颜色都会被处理为0)
- 循环处理像素点,将第四步转换后的255(背景色)转换为你想要的颜色
- 输出,保存
import cv2
import numpy as np
# 读取照片
img=cv2.imread('zhuominghua.jpg')
# 图像缩放
img = cv2.resize(img,None,fx=0.5,fy=0.5)
rows,cols,channels = img.shape
print(rows,cols,channels)
cv2.imshow('[img]',img)
# 图片转换为灰度图
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
# 查看灰度图
cv2.imshow('hsv',hsv)
# 图片的二值化处理
lower_blue=np.array([100,0,200])
upper_blue=np.array([200,255,255])
mask = cv2.inRange(hsv, lower_blue, upper_blue)
print(mask)
#腐蚀膨胀
erode=cv2.erode(mask,None,iterations=1)
# cv2.imshow('erode',erode)
dilate=cv2.dilate(erode,None,iterations=1)
# cv2.imshow('dilate',dilate)
#遍历每个像素点,进行颜色的替换
for i in range(rows):
for j in range(cols):
if erode[i,j]==255: # 像素点为255表示的是白色,我们就是要将白色处的像素点,替换为红色
img[i,j]=(255,255,255) # 此处替换颜色,为BGR通道,不是RGB通道
# 显示处理后的图片
cv2.imshow('res',img)
# 保存
cv2.imwrite("zhuominghu_white.jpg", img)
# 窗口等待的命令,0表示无限等待
cv2.waitKey(0)
代码是参照网上的例子,经过实验,很好用
但是在图片的二值化处理阶段,比较麻烦,需要从灰度图中获取背景色的BGR值,再计算上下边界
灰度图的颜色使用BGR表示的,而不是 RGB
使用的到方法:
- imread() 读取源图片
- imshow() 展示图片
- imwrite() 输出图片
- cvtColor() 转换灰度图
- inRange() 二值化处理,将上下边界内的颜色值处理为255,其他的颜色值处理为0