第一次使用opencv,遇到了很多问题,记录一下

安装问题

代理

由于pip使用了代理而电脑代理没开,导致pip install opencv-python时一直报错连接不上代理

解决办法:

  1. 使用pip install -i <清华源>
  2. 开启代理

无法引入jar包

安装完成后在交互模式可以正常使用

输入python

import cv2

不报错就说明正常安装了

但是在jupyter notebook 中引入一直报错,找不到cv2模块

经过百度后,测试如下

交互模式下输入如下命令查看python环境

import sys
sys.executable

opencvjava 证件照背景 opencv证件照背景替换python_计算机视觉

这是anaconda下的一个虚拟环境,没有问题

再在jupyter notebook下输入同样的命令,查看python环境,发现竟然不是上述环境

而是 anaconda3/share下的环境

至此,就查询到了问题的原因:

jupyter notebook 是anaconda的公共包

进入虚拟环境后 pip install jupyter 再次启动jupyter notebooke 就正常了


使用opencv及原理

使用opencv换照片底色的原理很简单

  1. 读取照片
  2. 将照片转换为灰度图
  3. 提取灰度图底色的BGR上下边界
  4. 使用opencv转换背景底色的BGR值(第三步已经获取了背景色的上下边界,边界之中的所有颜色都会被转换为255,边界之外的颜色都会被处理为0)
  5. 循环处理像素点,将第四步转换后的255(背景色)转换为你想要的颜色
  6. 输出,保存
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


使用的到方法:

  1. imread() 读取源图片
  2. imshow() 展示图片
  3. imwrite() 输出图片
  4. cvtColor() 转换灰度图
  5. inRange() 二值化处理,将上下边界内的颜色值处理为255,其他的颜色值处理为0