7.1 OpenCV入门
一、OpenCV简介
OpenCV是个什么东西呢?它的全称是Open source Computer Vision Library,开放源代码计算机视觉库,如上图所示我们看到的正是OpenCV的logo,可以看到由鲜明的R、G、B三基色的三个小圆环构成,也就是说,它是一套关于计算机视觉的开放源代码的API函数库。这也就意味着:
(1)不管是科学研究,还是商业应用,都可以利用它来作开发;
(2)所有API函数的源代码都是公开的,你可以看到其内部实现的程序步骤;
(3)你可以修改OpenCV的源代码,编译生成你需要的特定API函数。
在树莓派上的图像处理用到了OpenCV的函数库的某些函数,或者可以说在绝大部分图像处理设计领域都离不开它的存在了,早在许多年前至今在入侵检测、特定目标跟踪、目标检测、人脸检测、人脸识别、人脸跟踪等领域,OpenCV可谓大显身手,而这些,仅仅是其应用的冰山一角。既然我们认识到OpenCV如此的通用,在这章节课程中会给你介绍几种我们我们课程中用到的一些很基础的图像处理函数,也是一些通用的函数,如果你对Opencv计算机视觉库开发很感兴趣想深入了解的话下面提供了几个网站可供大家参考研究学习:
OpenCV 官方主页:https://www.opencv.org
OpenCV 中文论坛:http://www.opencv.org.cn
OpenCV CSDN 论坛:https://bbs.csdn.net/forums/OpenCV
二、OpenCV图片读取与展示
1、图像的读入:
img = cv2.imread('yahboom.jpg', 0) 第一个参数是图片的路径,第二个参数是如何读取这幅图片。
cv2.IMREAD_UNCHANGED:保持原格式不变,-1;
cv2.IMREAD_COLOR:以灰度模式读入图片,可以用0表示;
cv2.IMREAD_GRAYSCALE,1:,读入一副彩色图片,可以用1表示;默认值
cv2.IMREAD_UNCHANGED:读入一幅图片,并包括其alpha通道,可以用2表示。
2、图像的展示
import cv2
img = cv2.imread('yahboom.jpg', 1) # cv2.imshow('image', img) #此行只能命令行处py文件执行,会弹出一个视频窗口 # cv2.waitKey (0) |
#bgr8转jpeg格式 import enum import cv2 def bgr8_to_jpeg(value, quality=75): return bytes(cv2.imencode('.jpg', value)[1]) |
# jupyterLab中的图像组件显示读取到的图像
import ipywidgets.widgets as widgets image_widget = widgets.Image(format='jpg', width=800, height=800) display(image_widget)
image_widget.value = bgr8_to_jpeg(img) |
三、OpenCV图片写入
函数方法:cv2.imwrite('yahboom1.jpg', img)
第一个参数是保存的文件名,第二个参数是保存的图像
下面我们演示下图像写入的方法,首先读取一张图像yahboom.jpg,然后写到yahboom1.jpg.
import cv2
# 1 文件的读取 2 封装格式解析 3 数据解码 4 数据加载 img = cv2.imread('yahboom.jpg', 1) # cv2.imshow('yahboom, img) #看下面注意解释 cv2.imwrite('yahboom1.jpg', img) # 1 name 2 data |
注意:这里我们在jupyLab中cv2.imshow('yahboom, img)函数是无法执行的,如果需要用到这句显示读取到的图像,则需要在树莓派图像化界面通过命令执行python文件,命令:python3 XX.py
#bgr8转jpeg格式 import enum import cv2
def bgr8_to_jpeg(value, quality=75): return bytes(cv2.imencode('.jpg', value)[1]) |
import ipywidgets.widgets as widgets
image_widget = widgets.Image(format='jpg', width=320, height=240) display(image_widget) img = cv2.imread('yahboom1.jpg',1) image_widget.value = bgr8_to_jpeg(img) |
四、OpenCV图像质量
1、压缩方式
cv2.imwrite('yahboomTest.jpg', img, [cv2.IMWRITE_JPEG_QUALITY, 50])
cv2.CV_IMWRITE_JPEG_QUALITY: 设置图片格式为.jpeg或者.jpg的图片质量,其值为0---100(数值越大质量越高),默认95
cv2.CV_IMWRITE_WEBP_QUALITY: 设置图片的格式为.webp格式的图片质量,值为0--100
cv2.CV_IMWRITE_PNG_COMPRESSION: 设置.png格式的压缩比,其值为0--9(数值越大,压缩比越大),默认为3
import cv2 img = cv2.imread('yahboom.jpg',1) cv2.imwrite('yahboomTest.jpg', img, [cv2.IMWRITE_JPEG_QUALITY, 50]) #1M 100k 10k 0-100 有损压缩 |
# 1 无损 2 透明度属性 import cv2 img = cv2.imread('yahboom.jpg',1) cv2.imwrite('yahboomTest.png', img, [cv2.IMWRITE_PNG_COMPRESSION,0]) # jpg 0 压缩比高0-100 png 0 压缩比低0-9 |
#bgr8转jpeg格式 import enum import cv2
def bgr8_to_jpeg(value, quality=75): return bytes(cv2.imencode('.jpg', value)[1]) |
import ipywidgets.widgets as widgets
image_widget1 = widgets.Image(format='jpg', ) image_widget2 = widgets.Image(format='jpg', ) # create a horizontal box container to place the image widget next to eachother image_container = widgets.HBox([image_widget1, image_widget2])
# display the container in this cell's output display(image_container)
img1 = cv2.imread('yahboomTest.jpg',1) img2 = cv2.imread('yahboomTest.png',1) image_widget1.value = bgr8_to_jpeg(img1) image_widget2.value = bgr8_to_jpeg(img2) |
五、OpenCV像素操作
像素操作,我们可以给任意位置改成新的像素颜色,这里我们先读取图像,然后赋值一个区域为白色。
import cv2
img = cv2.imread('yahboom.jpg',1) (b,g,r) = img[100,100] print(b,g,r)# bgr #10 100 --- 110 100 i=j=0 for j in range(1,500): img[i,j] = (255,255,255) for i in range(1,500): img[i,j] = (255,255,255)
# cv2.imshow('image',img) # cv2.waitKey(0) #1000 ms |
#bgr8转jpeg格式 import enum import cv2
def bgr8_to_jpeg(value, quality=75): return bytes(cv2.imencode('.jpg', value)[1]) |
使用JupyterLab显示前后图像对比:
import ipywidgets.widgets as widgets
image_widget1 = widgets.Image(format='jpg', ) image_widget2 = widgets.Image(format='jpg', ) # create a horizontal box container to place the image widget next to eachother image_container = widgets.HBox([image_widget1, image_widget2])
# display the container in this cell's output display(image_container)
img1 = cv2.imread('yahboom.jpg',1)
image_widget1.value = bgr8_to_jpeg(img1) #原始的 image_widget2.value = bgr8_to_jpeg(img) #经过像素操作的 |