Image Processing

本文介绍了OpenCV的图像读取、保存、显示和转换,包括cv.imread(), cv.imshow(), cv.imwrite()等函数的使用。此外,还讲解了如何利用OpenCV进行图形绘制,如线条、矩形、圆形、椭圆和多边形,并提到了颜色模式的差异以及如何与Matplotlib配合显示图像。同时,还涉及到视频处理的基础,如VideoCapture和VideoWriter。" 133710742,315221,555定时器详解:原理、模式与应用,"['嵌入式硬件', '单片机', '硬件工程', '555定时器']

opencv

cv.imread()用于读取一个图片,即使图片的名称错误或者该图片不在工作目录下,也不会抛出异常,而是返回None

import numpy as np
import cv2 as cv

img=cv.imread("test.jpg",1)

第一个参数为打开图片的名称,第二个参数为打开方式

  • cv.IMREAD_COLOR,加载彩色图片,这是默认设置,可以用数字1代表
  • cv.IMREAD_GRAYSCALE,以灰度模式加载图片,加载出来的图片是灰白的,可以用数字0代表
  • cv.IMREAD_UNCHANGED,可以用数字-1代表

cv.waitKey(),参数的单位为毫秒,当参数为0时,无限期等待一个按键输入,当参数不为0时,在这个时间内等待一个按键输入

cv.destroyAllWindows(),销毁所有我们创建的窗口,当想销毁一个特殊的窗口时,应该使用destroyWindow(),将该窗口的名称作为参数传递过去

cv.imwrite(),该函数用于保存一个图片,第一个参数为保存的图片的名称,第二个参数需要保存的图片对象,会把图片保存在工作目录下

import numpy as np
import cv2 as cv

img=cv.imread("test.jpg",1)
cv.imwrite("result.jpg",img)

Matpiotlib是一个python的绘图库,里面包含了很多绘图的方法

利用opencv加载的彩色图像是BGR模式的,但是Matplotlib利用RGB模式进行展示,所以如果是彩色图片的话,利用Matplotlib展示的话有可能会出现错误

从摄像头获取视频,下面这段代码可以打开笔记本上的摄像头;读取已经存在的视频做法类似,将VideoCapture的参数改成要读取的视频的名称即可

import numpy as np
import cv2 as cv

cap=cv.VideoCapture(0)
if not cap.isOpened():
    print ("can't not open camera")
    exit()
while True:
    _,frame=cap.read()
    gray=cv.cvtColor(frame,cv.COLOR_BGR2GRAY)
        
    cv.imshow('frame',gray)
    k=cv2.waitKey(5)&0xFF
    if k==27:
        break
            
cap.release()
cv.destroyAllWindows()

当我们需要保存一个图片时,使用cv.imwrite()即可,保存一个视频时,步骤会多一些,我们需要传递四个参数,第一个参数为把这个视频保存的文件的名称,第二个是FourCC code,它是一个四字节编码,用来声明视频数据流格式,第三个参数为每秒的帧数,第四个参数为帧的尺寸,包括长和宽,需要用一个元组的形式进行传递

FourCC code可以用以下两种方式进行传递MJPG这个编码

  • cv.VideoWriter_fourcc('M','J','P','G')
  • cv.VideoWriter_fourcc(*'MJPG')
import numpy as np
import cv2 as cv
cap = cv.VideoCapture(0)
# Define the codec and create VideoWriter object
fourcc = cv.VideoWriter_fourcc(*'XVID')
out = cv.VideoWriter('output.avi', fourcc, 20.0, (640,  480))
while cap.isOpened():
    ret, frame = cap.read()
    frame = cv.flip(frame, 0)
    # write the flipped frame
    out.write(frame)
    cv.imshow('frame', frame)
    if cv.waitKey(1) == ord('q'):
        break
# Release everything if job is finished
cap.release()
out.release()
cv.destroyAllWindows()

opencv中的一些drawing function,在这些函数中我们需要提供如下一些参数

  • img,也就是你想要在哪个图像上进行画图
  • color,图形的颜色,用一个元组进行表示,将这个元组作为参数传递进去,比如(255,0,0)表示蓝色,对于一个灰度图像,就只需要传递一个标量值
  • thickness,传递一个数表示线的厚度,-1作为特殊的一个参数,一般是像圆这种封闭图形使用
  • lineType:线的种类,一般有8-connected和anti-aliased两种类型,8-connected是默认的,cv.LINE_AA参数使用anti-aliased类型

画线使用的函数是cv.line(),需要将线的起点坐标和终点坐标传递进去

画一个矩形使用的函数是cv.rectangle(),需要将左定点的坐标和右底点的坐标传递进

画一个圆使用的函数是cv.circle(),需要将圆的圆心以及半径传递进去,厚度设置为-1

画一个椭圆使用的函数cv.ellipse(),需要传递的基本参数有8个,第一个参数是img,第二个参数是椭圆中心的坐标,以元组的形式传递,第三个参数是椭圆的长轴和短轴,以元组的形式进行传递,第四个参数是椭圆在图像中显示时旋转的角度,为0的话椭圆就正常显示,若不为0,椭圆则进行相应角度的旋转,第五个和第六个参数是椭圆的开始角度和结束角度,譬如说,开始角度为0,结束角度为360,则显示一个完整的椭圆,若开始角度为0,结束角度为180,则显示一个半椭圆,第七个参数是显示的颜色,第八个参数是线的厚度,椭圆跟圆类似,传递-1就显示一个被填充起来的椭圆

画一个多边形使用的函数是cv.polylines(),需要传递的参数有5个,第一个参数是img,第二个参数是一个序列,序列中存放着以序列为基本单位的各顶点的坐标,第三个参数为True或者False,当这个参数为True时,得到一个封闭的图形,为False时得到一个不封闭的图形,第四个参数为代表颜色的元组,第五个参数为thickness,第六个参数可选,为线的种类

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt 

#Create a black image
img=np.zeros((512,512,3),np.uint8)

#Draw a diagonal blue line with thickness of 5 px
#img,线的起点,线的终点,颜色,thickness
cv.line(img,(0,0),(511,511),(255,0,0),5)
#img,左顶点,右底点,颜色,thickness,线的种类(LINE_4,LINE_8,LINE_AA)
cv.rectangle(img,(384,0),(510,128),(0,255,0),-1,cv.LINE_AA)
#img,圆心,半径,颜色,thickness
cv.circle(img,(447,63),63,(0,0,255),5)
#img,椭圆的中心,(长轴,短轴),角度,开始角度,结束角度,颜色,厚度(-1是因为和圆一样,椭圆也是个封闭图形)
cv.ellipse(img,(256,256),(100,50),80,0,360,255,-1,cv.LINE_AA)
#一个存放polygon顶点的array,类型为int32
pts=np.array([[50,50],[200,300],[200,200],[500,100]],np.int32)
#reshape的作用:gives a new shape to an array withou changing its data貌似去掉也没影响?
#pts=pts.reshape((-1,1,2))
cv.polylines(img,[pts],True,(0,255,255),5,cv.LINE_AA)
#使用的字体的种类
font=cv.FONT_HERSHEY_SIMPLEX
#img,要显示的内容,文本左底点的坐标,使用的字体的种类,字体大小,颜色,thickness,lineType
cv.putText(img,'Hello!',(10,500),font,5,(255,255,255),5,cv.LINE_AA)
plt.imshow(img,'gray')

在opev下对image进行操作,采用的是BGR模式,在matplotlib下对图像进行操作,使用的是RGB模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值