OpenCV(Open Source Computer Vision Library)
是一个开源的计算机视觉和机器学习软件库,它提供了大量的图像和视频处理功能。OpenCV由一系列C/C++语言编写的函数和类组成,同时也支持Python和其他语言的接口。
opencv的基础图像操作
import cv2
#读取、显示图像
data = cv2.imread("qq.png")
cv2.imshow('QQ',data)
cv2.waitKey(0)
# 保存图像
cv2.imwrite("qq2.png",data)
绘制几何图形
# 绘制直线:cv2.line(img,start,end,color,thickness)
cv2.line(data, (100, 100), (200, 200), (0, 0, 255), 2)
# 绘制圆形 cv.circle(img,centerpoint, r, color, thickness)
cv2.circle(data, (300, 200), 100, (1, 11, 111))
# 绘制矩形cv.rectangle(img,leftupper,rightdown,color,thickness)
cv2.rectangle(data, (150, 150), (250, 250), (0, 0, 255), 2)
# 向图像中添加文字putText(img,text,station, font, Fontscale ,color,thickness,cv2.LINE_AA)
cv2.putText(data,"QQqqQQ",(180,50),cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
# 获取并修改图像中的像素点
data2 = data[100,100]
print(data2)
data[100,100] = [0,255,0]
计算机中的图像
1. 像素(Pixel)
- 像素是图像的基本单元,存储颜色、亮度等特征。
- 图像由一系列像素组成,每个像素以二进制格式存储。
2. 图像类型
- RGB图像:使用红(R)、绿(G)、蓝(B)三种颜色通道表示,可以组合出几乎所有颜色。
- 二值图像:仅包含0和1两个像素值,代表黑色和白色,适用于OCR和掩膜图像存储。
- 灰度图像:每个像素只有一个颜色采样,显示从黑色到白色的不同灰度。通常使用8位非线性尺度保存,可表示256级灰度。
- 彩色图像:每个像素由RGB三个分量表示,数据类型通常为8位无符号整形,用于表示真彩色图像。
灰度实验
# 最大值法
data_shape = data.shape
data_arr = np.zeros((data_shape[0], data_shape[1]),dtype=np.uint8)
for i in range(data_shape[0]):
for j in range(data_shape[1]):
data_arr[i][j] = max(data[i, j][0], data[i, j][1], data[i, j][2])
# 平均值法
data_shape = data.shape
data_arr = np.zeros((data_shape[0], data_shape[1]), dtype=np.uint8)
for i in range(data_shape[0]):
for j in range(data_shape[1]):
data_arr[i][j] = (int(data[i, j][0]) + int(data[i, j][1]) + int(data[i, j][2])) / 3
# 加权均值法(内置)0.299R + 0.587G + 0.114*B
data_arr = cv2.cvtColor(data, cv2.COLOR_BGR2GRAY)
二值化实验
#阈值法
_,data_arr = cv2.threshold(data,127,255,cv2.THRESH_BINARY)
#反阈值法
_,data_arr = cv2.threshold(data,127,255,cv2.THRESH_BINARY——INV)
# 截断阈值法
_,data_arr = cv2.threshold(data,127,255,cv2.THRESH_TOZERO)
# 截断阈值法
_,data_arr = cv2.threshold(data,127,255,cv2.THRESH_TRUNC)
# 低阈值零处理
_,data_arr = cv2.threshold(data,127,255,cv2.THRESH_TOZERO)
# 超阈值零处理
_,data_arr = cv2.threshold(data,127,255,cv2.THRESH_TOZERO_INV)
# OTSU阈值法,自动图像阈值分割方法适用于将前景和背景分离
_,data_arr = cv2.threshold(data,127,255,cv2.THRESH_OTSU)
自适应二值化
adaptiveThreshold
的关键参数:
src
: 输入图像,必须是单通道灰度图像。maxValue
: 二值化后的前景像素的最大值,通常设置为255。adaptiveMethod
: 自适应方法,可以是cv2.ADAPTIVE_THRESH_MEAN_C
(平均值)或cv2.ADAPTIVE_THRESH_GAUSSIAN_C(加权值使用高斯正态分布)
。thresholdType
: 阈值类型,通常与cv2.THRESH_BINARY
或cv2.THRESH_BINARY_INV
结合使用。blockSize
: 考虑像素邻域的大小,必须是奇数。C
: 常数,用于阈值计算,表示阈值偏移量。
import cv2
# 灰度读取图像
data = cv2.imread("qq.png", cv2.IMREAD_GRAYSCALE)
# 自适应二值化
data_arr = cv2.adaptiveThreshold(data, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 7, 10)
data_arr2 = cv2.adaptiveThreshold(data, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 7, 10)
cv2.imshow('QQ1', data)
cv2.imshow('QQ2', data_arr)
cv2.imshow('QQ3', data_arr2)
cv2.waitKey(0)
练习:摄像头实时采集并渲染 自适应二值化图像
把视频存入video.avi
import cv2
# 视频参数
fps = 30 # 帧率
frame_width = 640 # 视频宽度
frame_height = 480 # 视频高度
codec = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter("video.avi", codec, fps, (frame_width, frame_height))
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
data = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
data_arr = cv2.adaptiveThreshold(data, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 7, 10)
data_arr = cv2.merge((data_arr, data_arr, data_arr))
cv2.imshow('video', data_arr)
out.write(data_arr)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
out.release()
cv2.destroyAllWindows()
读取video.avi
import cv2
cap = cv2.VideoCapture("video.avi")
if not cap.isOpened():
print("error")
exit()
while True:
ret, frame = cap.read()
if not ret:
print("Failed ")
break
cv2.imshow("video.avi", frame)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
cap.release()
cv2.destroyAllWindows()