OpenCV需要掌握哪些知识
- Python编程语言
- 数组和矩阵操作
- 图像处理和分析
- 视频处理和分析
- 特征提取和描述符
- 目标检测和跟踪
- 摄像头校准和3D重建
常用的模块包括
- 核心功能(core module):包括基本的数据结构、线性代数、矩阵操作等。
- 图像处理(imgproc module):包括图像处理、图像分割、形态学操作等。
- 视频处理(video module):包括视频捕获、视频编码、视频解码等。
- 特征检测与描述(features2d module):包括特征检测、特征描述等。
- 目标检测(objdetect module):包括人脸检测、行人检测等。
- 机器学习(ml module):包括支持向量机、随机森林等。
- 深度学习(dnn module):包括深度神经网络等。
对应的头文件
#include <opencv2/opencv.hpp>——opencv.hpp
是OpenCV的主要头文件,包含了所有其他OpenCV模块的头文件。这个头文件包含了OpenCV的所有基本功能,如图像处理、计算机视觉、机器学习等。因此,如果您想使用OpenCV的所有功能,只需包含此头文件即可。
- 核心功能:opencv2/core.hpp
- 图像处理:opencv2/imgproc.hpp
- 特征检测:opencv2/features2d.hpp
- 目标检测:opencv2/objdetect.hpp
- 机器学习:opencv2/ml.hpp
- 视频处理:opencv2/video.hpp
OpenCV入门常用的函数
1、cvLoadImage:将图像文件加载至内存;
2、cvNamedWindow:在屏幕上创建一个窗口;
3、cvShowImage:在一个已创建好的窗口中显示图像;
4、cvWaitKey:使程序暂停,等待用户触发一个按键操作;
5、cvReleaseImage:释放图像文件所分配的内存;
6、cvDestroyWindow:销毁显示图像文件的窗口;
7、cvCreateFileCapture:通过参数设置确定要读入的AVI文件;
219个opencv常用函数汇总 - 腾讯云开发者社区-腾讯云 (tencent.com)(常用函数摘录来源)
OpenCV 常用库
- cv2.imread():读取图片
- cv2.imshow():显示图片
- cv2.imwrite():保存图片
- cv2.cvtColor():颜色空间转换
- cv2.resize():调整图片大小
- cv2.threshold():阈值分割
- cv2.GaussianBlur():高斯滤波
- cv2.Canny():边缘检测
- cv2.HoughLinesP():直线检测
板块学习
1.数据导入
1.1 图片
1.1.1 读取图片
以numpy格式存储,颜色空间为RGB
# cv2.imread(<img_path>)
img1=cv2.imread('1.jpg') #1.jpg为存放在与main.py同目录里的图片文件,不加flags参数
cv2.imshow("cc",img1)
cv2.waitKey(0) #延时0ms刷新,等待任意按键退出
#等待键盘按键效果,delayTime为延时,其功能是不断刷新图像,频率时间为delay,单位为ms
1.1.2 转换颜色空间类型
# cv2.cvtColor(<img>, <flag>)
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) # BGR -> 灰度图
rgb1 = cv2.cvtColor(gray1, cv2.COLOR_GRAY2BGR) # 灰度图 -> BGR
常见/常用的是以下几种:
cv2.COLOR_BGR2GRAY:BGR到灰度
cv2.COLOR_GRAY2BGR:灰度到BGR
cv2.COLOR_BGR2RGB:BGR到RGB
cv2.COLOR_RGB2BGR:RGB到BGR
cv2.COLOR_BGR2HSV:BGR到HSV
cv2.COLOR_HSV2BGR:HSV到BGR
cv2与matplotlib一起使用时,需要将 BGR->RGB
1.1.3 保存图片
可以保存为任意类型的图片,如jpg、png等
# cv2.imwrite(<example.jpg>, <img>)
cv2.imwrite('saveimg.jpg', img1)
1.1.4构造图像
使用numpy和imshow函数
第一步,使用numpy构造一个300x300的像素值全为1的矩阵matrix1:
import numpy as np
matrix1 = np.mat(np.ones((300,300),dtype=np.unit8)) #构造一个值全是1的二维矩阵,300x300大小
代码中uint8是专门用于存储各种图像的(包括RGB,灰度图像等),范围是从0-255。
执行结果为:
[[1 1 1 ... 1 1 1]
[1 1 1 ... 1 1 1]
[1 1 1 ... 1 1 1]
...
[1 1 1 ... 1 1 1]
[1 1 1 ... 1 1 1]
[1 1 1 ... 1 1 1]]
第二步,构造一个300x300的像素值全为0的矩阵matrix2:
import numpy as np
matrix2 = np.mat(np.zeros((300,300),dtype=np.unit8)) #构造一个值全是0的二维矩阵,300x300大小
执行结果为:
[[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]
...
[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]]
第三步,使用numpy的random方法来构造像素值为随机值的矩阵matrix3:
import numpy as np
matrix3 = np.mat(np.random.randint(0,255,(300,300),dtype=np.uint8)) #构造一个随机赋值的二维矩阵,300x300大小
执行结果为:
[[ 75 139 239 ... 72 76 49]
[ 47 7 122 ... 246 141 134]
[112 95 8 ... 4 231 245]
...
[251 132 162 ... 185 186 6]
[188 246 253 ... 104 180 24]
[148 26 207 ... 60 195 101]]
有了像素矩阵后,就可以直接使用cv2的imshow函数将其转换为图形对象显示出来。下面我们就对上述生成的三个像素矩阵进行显示:
import numpy as np
import cv2,random
#构建三个像素矩阵
matrix1= np.mat(np.zeros((300,300),dtype=np.uint8))
matrix2= np.mat(np.ones((300,300),dtype=np.uint8))
matrix3= np.mat(np.random.randint(0,255,(300,300),dtype=np.uint8))
#显示矩阵对应图像
cv2.imshow("img1",matrix1)
cv2.imshow("img2",matrix2)
cv2.imshow("img3",matrix3)
1.1.5彩色图像
RGB三通道
如下实现:
matrixR= np.mat(np.random.randint(0,255,(300,300),dtype=np.uint8)) #生成R通道矩阵
matrixG= np.mat(np.random.randint(0,255,(300,300),dtype=np.uint8)) #生成G通道矩阵
matrixB= np.mat(np.random.randint(0,255,(300,300),dtype=np.uint8)) #生成B通道矩阵
RGBimg = cv2.merge([matrixR,matrixG,matrixB]) #融合三个通道像素
cv2.imshow("final",RGBimg) #显示
彩色图像进行像素值读取
使用坐标或者索引方式来获得像素值:
img1=cv2.imread('imgTools/IMG2.jpg')
print(img1[100,100]) #读取图像里坐标为横轴为100,纵轴为100那个点的像素值
print(img1[100,100,0]) #读取图像坐标(100,100)位置那个点R通道像素值
print(img1[100,100,1]) #读取图像坐标(100,100)位置那个点G通道像素值
print(img1[100,100,2]) #读取图像坐标(100,100)位置那个点B通道像素值
获得某一行或某一列的像素值,或者某一个范围的像素值,都可以采用切片方式:
img1=cv2.imread('imgTools/IMG2.jpg')
print(img1[100]) #读取图像里坐标为横轴为100时那一行的像素值
print(img1[:,100]) #读取图像里坐标为纵轴为100时那一列的像素值
print(img1[100:108]) #读取图像坐标横轴从100到108共8行的像素值
print(img1[:,100:108]) #读取图像坐标纵轴从100到108共8列的像素值
print(img1[100:108,100:108]) #读取图像坐标横轴从100到108行,纵轴从100到108列的一个小矩形框里的像素
1.1.6对图像部分位置进行替换
截取了那个范围的图像,如果再使用imshow来显示的话,就可以将该范围的图像显示出来。同时也可以直接赋值改变那个范围的像素值,进而改变那个范围的图像显示,如下实践:
matrixR= np.mat(np.random.randint(0,255,(150,150),dtype=np.uint8))
matrixG= np.mat(np.random.randint(0,255,(150,150),dtype=np.uint8))
matrixB= np.mat(np.random.randint(0,255,(150,150),dtype=np.uint8))
RGBimg = cv2.merge([matrixR,matrixG,matrixB])
img1=cv2.imread('imgTools/IMG2.jpg')
img1[100:250,100:250]=RGBimg #将img1的部分区域替换为新的像素值
cv2.imshow("img1",img1)
1.1.7对彩色图像实现三通道分离
使用cv2的split函数
img1=cv2.imread('imgTools/IMG2.jpg')
r,g,b=cv2.split(img1)
分离的三个通道像素矩阵都绘成图对比,使用cv2的imshow函数:
img1=cv2.imread('imgTools/IMG2.jpg')
r,g,b=cv2.split(img1)
for index,item in enumerate(cv2.split(img1)):
cv2.imshow('item-'+str(index),item)
1.2 视频
1.2.1读取视频方法
//方法一
VideoCapture cap("E:/myFile/video/ty.mp4");//获取E:/myFile/video路径下的ty.mp4视频文件
//方法二
VideoCapture cap;
cap.open("E:/myFile/video/ty.mp4");//使用open方法
1.2.2验证视频是否读入成功
若成功读取视频文件则放回True,否则返回False
if (!cap.isOpened())
{
cout << "无法打开视频文件!" << endl;
return -1;
}
1.2.3读取视频并处理每一帧图片
video_path = 'XXXX.mp4' # 支持多种视频格式
cap = cv2.VideoCapture(video_path)
fps = int(cap.get(5))
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),
int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
while True:
ret,frame = cap.read()
if frame is None:
break
pred = det.detect(img)
a = cv2.waitKey(int(1000/fps))
if ord('q') == a:
cap.release()
break
cap.release()
cv2.destroyAllWindows()
1.2.4设置视频帧的读取位置
VideoCapture类的set方法可以允许我们取出视频中某个位置的帧,它有一些参数,可以按时间,也可以按帧号,还可以按视频长短的比例
//第100帧
double position=100.0;
capture.set(CV_CAP_PROP_POS_FRAMES,position);
//第1e6毫秒
double position=1e6;
capture.set(CV_CAP_PROP_POS_MSEC,position);
//视频1/2位置
double position=0.5;
capture.set(CV_CAP_PROP_POS_AVI_RATIO,position);
1.2.5整体代码示例
视频读取
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
VideoCapture cap("E:/myFile/video/ty.mp4");
Mat frame;
if (!cap.isOpened())
{
cout << "无法打开视频文件!" << endl;
return -1;
}
namedWindow("video", CV_WINDOW_AUTOSIZE);
while (cap.read(frame))
{
imshow("video", frame);
waitKey(10);
}
cap.release();
waitKey(0);
return 0;
}
视频写入
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
VideoCapture cap("E:/myFile/video/ty.mp4");
Mat frame, gray;
if (!cap.isOpened())
{
cout << "无法打开视频文件!" << endl;
return -1;
}
//获取视频帧的长和宽
Size size = Size(cap.get(CV_CAP_PROP_FRAME_WIDTH), cap.get(CV_CAP_PROP_FRAME_HEIGHT));
VideoWriter writer("E:/myFile/video/ty_g.mp4", CV_FOURCC('M', 'J', 'P', 'G'), 24, size, true);
namedWindow("video", CV_WINDOW_AUTOSIZE);
while (cap.read(frame))
{
//imshow("video", frame);
//转换为黑白图像
cvtColor(frame, gray, COLOR_BGR2GRAY);
//二值化处理
threshold(gray, gray, 0, 255, THRESH_BINARY | THRESH_OTSU);
cvtColor(gray, gray, COLOR_GRAY2BGR);
imshow("video", gray);
writer.write(gray);
waitKey(10);
}
waitKey(0);
cap.release();
return 0;
}
1.3 展示图片
1.3.1 新建窗口
cv2.namedWindow(<Window_Name>, <flag>)
cv2.namedWindow('origin',0)
cv2.resizeWindow('origin', 900,900)
原文链接:1、https://blog.csdn.net/LoveJSH/article/details/129542123
2、图像处理之OpenCV的基础使用 - 知乎 (zhihu.com)
3、219个opencv常用函数汇总 - 腾讯云开发者社区-腾讯云 (tencent.com)
4、(44条消息) OpenCV常用库函数_opencv库函数_Smart_zy的博客-CSDN博客
5、https://blog.csdn.net/Gary_ghw/article/details/102987775