1.Open Source CV入门

您当前位置: 首页 > DOFBOT AI视觉机械臂(Jetson nano版) > Open Source CV课程

7.1 Open Source CV入门

一、OpenCV简介

                                              image.png

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、图像的展示

代码路径: /home/jetson/Dofbot/4.opencv/1.OpenCV入门/ 01_OpenCV图片读取与展示.ipynb

 

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)

image.png

 

三、OpenCV图片写入

函数方法:cv2.imwrite('yahboom1.jpg',  img)

第一个参数是保存的文件名,第二个参数是保存的图像

下面我们演示下图像写入的方法,首先读取一张图像yahboom.jpg,然后写到yahboom1.jpg.

 

代码路径: /home/jetson/Dofbot/4.opencv/1.OpenCV入门/ 02_OpenCV图片写入.ipynb

 

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图像质量

代码路径: /home/jetson/Dofbot/4.opencv/1.OpenCV入门/ 03_OpenCV图像质量.ipynb

 

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)

image.png

 

五、OpenCV像素操作

像素操作,我们可以给任意位置改成新的像素颜色,这里我们先读取图像,然后赋值一个区域为白色。

代码路径: /home/jetson/Dofbot/4.opencv/1.OpenCV入门/ 04_OpenCV像素操作.ipynb

 

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)   #经过像素操作的

 

image.png