OpenCV学习笔记

OpenCV需要掌握哪些知识

  1. Python编程语言
  2. 数组和矩阵操作
  3. 图像处理和分析
  4. 视频处理和分析
  5. 特征提取和描述符
  6. 目标检测和跟踪
  7. 摄像头校准和3D重建

常用的模块包括

  1. 核心功能(core module):包括基本的数据结构、线性代数、矩阵操作等。
  2. 图像处理(imgproc module):包括图像处理、图像分割、形态学操作等。
  3. 视频处理(video module):包括视频捕获、视频编码、视频解码等。
  4. 特征检测与描述(features2d module):包括特征检测、特征描述等。
  5. 目标检测(objdetect module):包括人脸检测、行人检测等。
  6. 机器学习(ml module):包括支持向量机、随机森林等。
  7. 深度学习(dnn module):包括深度神经网络等。

 对应的头文件

#include <opencv2/opencv.hpp>——opencv.hpp是OpenCV的主要头文件,包含了所有其他OpenCV模块的头文件。这个头文件包含了OpenCV的所有基本功能,如图像处理、计算机视觉、机器学习等。因此,如果您想使用OpenCV的所有功能,只需包含此头文件即可。

  1. 核心功能:opencv2/core.hpp
  2. 图像处理:opencv2/imgproc.hpp
  3. 特征检测:opencv2/features2d.hpp
  4. 目标检测:opencv2/objdetect.hpp
  5. 机器学习:opencv2/ml.hpp
  6. 视频处理:opencv2/video.hpp

OpenCV入门常用的函数

1、cvLoadImage:将图像文件加载至内存;

2、cvNamedWindow:在屏幕上创建一个窗口;

3、cvShowImage:在一个已创建好的窗口中显示图像;

4、cvWaitKey:使程序暂停,等待用户触发一个按键操作;

5、cvReleaseImage:释放图像文件所分配的内存;

6、cvDestroyWindow:销毁显示图像文件的窗口;

7、cvCreateFileCapture:通过参数设置确定要读入的AVI文件;

219个opencv常用函数汇总 - 腾讯云开发者社区-腾讯云 (tencent.com)(常用函数摘录来源)

OpenCV 常用库

  1. cv2.imread():读取图片
  2. cv2.imshow():显示图片
  3. cv2.imwrite():保存图片
  4. cv2.cvtColor():颜色空间转换
  5. cv2.resize():调整图片大小
  6. cv2.threshold():阈值分割
  7. cv2.GaussianBlur():高斯滤波
  8. cv2.Canny():边缘检测
  9. 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 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值