以下内容是在学习过程中的一些笔记,难免会有错误和纰漏的地方。如果造成任何困扰,很抱歉。
OpenCV是计算机视觉中经典的专用库,具备支持多语言、跨平台的优点,OpenCV-Python为OpenCV提供了Python接口,这样使用者在Python中能够调用C/C++,从而在保证易读性和运行效率的前提下,实现所需的功能。
在深度学习领域中,通过在图像、视频中获取到相应的目标而进行业务分析,那么OpenCV在这里的作用是必不可少。
import cv2
# 读取图片
image = cv2.imread("C:/Users/13544/Desktop/qqq.png", cv2.IMREAD_UNCHANGED)
# 尺寸: (1080, 1920, 4)
# 所占内存大小: 8294400
# 存储图像使用的数据类型: uint8
print("尺寸:",image.shape)
print("所占内存大小:",image.size)
print("存储图像使用的数据类型:",image.dtype)
# 图像存储
cv2.imwrite("C:/Users/13544/Desktop/qqq2.png",image)
# 打开图片 第一个参数为窗口标题
cv2.imshow("www", image)
# 等待键盘输入
cv2.waitKey(0)
其中,imread包含了两个入参,fileName及flags,第一个参数filename是图像地址,即使图像路径错误,也不会引发任何错误,但是在打印图像时系统会给出None;第二个参数flags是一个标志,指定了读取图像的方式:
该函数返回修改后的图像数字矩阵,其中维度如下:
(M,N)灰度图
(M,N,3)RGB彩色图
import cv2
import matplotlib.pyplot as plt
image = cv2.imread("C:/Users/13544/Desktop/qqq.png", 0)
blur_demo = cv2.blur(image, (5, 5)) # 均值滤波
medianBlur_demo = cv2.medianBlur(image, (5)) # 中值滤波
GaussianBlur_demo = cv2.GaussianBlur(image, (5, 5), 0) # 高斯滤波
均值滤波是指通过将图像与低通滤波器内核进行卷积
来实现图像模糊,这对于消除噪声很有用。它实际上从图像中消除了高频部分(如噪声、边缘)。因此,在此操作中会使边缘有些模糊(利用一些模糊技术也可以不模糊边缘)。
中值滤波模板使用卷积框中像素的中值代替中心值
,从而达到去噪声的目的。
对于高斯模板,需要制定的是高斯核的高和宽(奇数),以及沿x方向与y方向的标准差(如果只给出x,则y=x;如果将x和y都设置为0,那么函数会自己计算)。高斯核可以有效地去除图像的高斯噪声
。
(1)通过Canny边缘检测算法,获取图像中的边缘、轮廓与角点,它是一个多阶段的算法,包括:
下面通过代码演示获取图像边缘效果,首先是原图
过Canny()函数
# 灰度图
image = cv2.imread("C:/Users/13544/Desktop/yuan_qq.jpg", 0)
# 使用Canny边缘检测算法 配合滞后阈值处理图像
edg = cv2.Canny(image, 200, 300)
# 打开图片 第一个参数为窗口标题
cv2.imshow("www", edg)
# 等待键盘输入
cv2.waitKey(0)
查看效果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vTw12AVc-1667143294606)(https://csdn-pic-1301850093.cos.ap-guangzhou.myqcloud.com/csdn-pic/opencv-边缘检测效果图-1.png)]
(2)轮廓就是临近的像素点连接而成的曲线,具有相同的颜色或灰度。轮廓检测常被应用于目标检测、物体检测中,cv2.findContours()
是OpenCV中常用的查找轮廓函数,入参如下
contours, hierarchy = cv2.findContours(
thresh,
cv2.RETR_TREE,
cv2.CHAIN_APPROX_SIMPLE
)
cv2.drawContours()
是OpenCV中常用的绘制轮廓函数,入参如下
img = cv2.drawContours(image, contours, -1, (0, 0, 255), 2)
下面查看代码示例
import cv2
# 灰度图
image = cv2.imread("C:/Users/13544/Desktop/qqq.png", 0)
# 使用二进制方式处理图像 像素在182-255的数据为1 小于182的数据为0
ret, thresh = cv2.threshold(image, 182, 255, 0)
# 查找轮廓
contours, hierarchy = cv2.findContours(
thresh,
cv2.RETR_TREE,
cv2.CHAIN_APPROX_SIMPLE
)
# 绘制轮廓
img = cv2.drawContours(image, contours, -1, (0, 0, 255), 2)
cv2.imshow("www", img)
cv2.waitKey(0)
原图
效果图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7HoYUNGn-1667143294607)(https://csdn-pic-1301850093.cos.ap-guangzhou.myqcloud.com/csdn-pic/opencv-一个案例的效果图-1.png)]
图像特征匹配可以帮助用户识别图像中的物体种类,如果用户使用另一张图像和当前图像做对比,就可以判断出两张图像中的物体是否是同一种类,从而达到匹配效果
使用Brute-Force匹配器,匹配两张图像数据
import cv2
# 灰度图
image1 = cv2.imread("C:/Users/13544/Desktop/watch1.jpg", 0)
image2 = cv2.imread("C:/Users/13544/Desktop/watch2.jpg", 0)
# 使用Brute-Force匹配器 并使用汉明距离计算进行交叉校验
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
# 查找最佳匹配
matches = bf.match(image1, image2)
# 将距离差排序
matches = sorted(matches, key=lambda x: x.distance)
直接上案例,下面注释的部分大多为读取视频信息包括帧率,每帧图像大小,内容等信息。
#!/bin/python
#### in rtsp server:
#### ffserver -f /etc/ffserver.conf &
#### ffmpeg -f v4l2 -i /dev/video0 -s 640x480 -r 24 -vcodec libx264 -an http://127.0.0.1:8090/feed1.ffm
import cv2
if __name__ == "__main__":
cap = cv2.VideoCapture("rtsp://admin:[email protected]:33554/h264/ch1/main/av_stream")
if cap.isOpened():
ret, frame = cap.read()
# print "==== ret ===="
# print ret
# print "====print dir(frame)===="
# print dir(frame)
# print "====print frame.shape===="
# print frame.shape
# print "====print (frame.shape[0], frame.shape[1], frame.shape[2])===="
# print (frame.shape[0], frame.shape[1], frame.shape[2])
# print "====print frame.size===="
# print frame.size
# print "====print frame.data===="
# #print frame.data
# #print type(frame.data)
# print "====print frame.copy===="
# print frame.copy
# print type(frame.copy)
# print "====print frame.ctypes===="
# -------------------------------------------------------------------------------------------
# !! frame.ctypes.data_as(c_char_p/c_void_p/...) 可以将python opencv读取到的图像转为
# C语言某种格式,在python传递参数给C语言的库时很有用。
# frame.ctypes.data_as(c_char_p):将一帧图像的内存地址转换为C语言char*型
# -------------------------------------------------------------------------------------------
print
frame.ctypes
print
type(frame.ctypes)
print
"====print frame.imag===="
# print frame.imag
# print type(frame.imag)
print
"====print frame.tobytes===="
print
frame.tobytes
print
type(frame.tobytes)
##cap.set(cv2.cv.CV_CAP_PROP_FRAME_WIDTH,640)
##cap.set(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT,480)
while cap.isOpened():
ret, frame = cap.read()
print(frame.shape[0], frame.shape[1], frame.shape[2])
# print ret
# print dir(frame)
# print frame.shape
# print frame.size
# print frame.data
cv2.imshow("frame", frame)
cv2.waitKey(10)
后续章节将通过RTSP流的实时信息进行目标检测识别。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lUnJp7iY-1667143294607)(https://csdn-pic-1301850093.cos.ap-guangzhou.myqcloud.com/csdn-pic/小星球-1.png)]