openCV3-api
本笔记主要用来记录openCV3中常用的api,大多数都是笔者在实际学习过程中用到的,可以说是经验总结,
对于openCV的学习方法主要还是要理论+实战才是正道.
在本笔记中,把api按照项目场景进行分类,其中:
- 第一章是描述的openCV的基础api比如图像创建、读取、颜色空间转换等,
- 第二章则是滤波、阈值、采样,
- 第三章则主要针对的是形态学操作,
- 第四章是边缘、轮廓检测,
- 第五章是模版匹配,
- 第六章是目标追踪,循序渐进从传统方法到深度学习方法递进.
笔记的章节并不是固定的,也不是独立的,相互之间存在重复记录,一方面为了复习,另一方面是某些章节之间存在较为紧密的联系.
笔记的章节数目也不是固定的,随着学习的深入,会不断的追加.
⚠️该笔记理论设计较少,若需掌握相关理论详情,需要参考DIP数字图像处理笔记,这里仅以openCV实现方法为主要学习、记忆目标.
第一章 openCV基础操作
openCV基础操作主要是图片、视频的读取,图片的颜色变换,基本形状的绘制等api,还有openCV中的基础类等
1.1元素数据类型
openCV中像素点的数据类型如CV_8UC3,表示该像素点在内存中占8位,U是unsigned无符号类型,C表示channels,即为3.
同理CV_32FC12表示,该像素点在内存中占32位,是float类型,channels=12
1.2 四大基本类
Point p = Point(20,30);
Size s = Size(1920,1080);
Scalar color = Scalar(255,0,0);
Rect rect = Rect(0,0,1920,1080);
对于Rect类而言,有如下内部成员
cout<<rect.tl();
cout<<rect.br();
cout<<rect.x;
cout<<rect.y;
cout<<rect.width();
cout<<rect.height();
1.3 绘制标准形状
cv::line(Mat src, Point p1, Point p2, Scalar color, int thickness, LINE_8,0);
cv::rectangle(Mat src, Rect rect, Scalar color, int thickness, LINE_8);
cv::putText(Mat src, String text, Point p, font_type, 12, Scalar color, int thickness, LINE_8);
1.4 Mat类
Mat类可以说是openCV中使用频率最高的类,首先介绍对图片的读取和复制
Mat src (2, 2, CV_8UC3, Scalar(0,0,255);
Mat src;
Mat a = imread ("~/a.png");
Mat a(b);
Mat c = a.clone();
Mat copyImage;
a.copyTo(copyImage);
上述是对已有图片进行读取复制,这些图片的像素值是已经被相机或其他设备记录好的,
那么如何创建一张像素值全是0或者全是1的像素呢? 或者指定宽高和具体像素值的图片呢?
Mat a = imread("~/a.jpeg");
Mat zero = Mat::zeros(a.size(), a.type());
Mat zero = Mat::zeros(2,2,CV_32FC3);
Mat dst;
dst.create(Size(20, 20), CV_32UC2);
//cv::Mat1d::Mat_(int rows, int cols)
Mat kernel = (Mat_<double>(3, 3)<<0, 1, 0, 1, 0, 1, 0, 1, 0);
filter2D(Mat src, Mat dst, src.depth(), kernel);
// 上述的filter2D()算子是用来进行滤波操作的
1.5 视频读取
VideoCapture cap ("~/video/a.mp4");
VideoCapture cap(0);
VideoCapture cap;
cap.open("~/video/a.mp4")
if(cap.isOpened()){}
Mat frame;
cap>>frame;
cap.read(frame);
if(cap.read(frame)){}
if(frame.empty()){}
cap.release();
上述是从视频或视频流中读取图片,判断读取内容,接下来需要解析图片参数
VideoCapture cap("~/video/a.mp4");
Mat frame;
cap>>frame;
//cap.read(frame);
int width = cap.get(CV_CAP_PROP_FRAME_WIDTH);
int height = cap.get(CV_CAP_PROP_FRAME_HEIGHT);
int frameRate = cap.get(CV_CAP_PROP_FPS);
int totalFrames = cap.get(CV_CAP_PROP_FRAME_COUNT);总帧数
1.6 图像显示、保存和转换
该节展示的是图像的读取,显示,修改保存等操作,修改主要包括的是颜色空间的转换等
Mat src = imread("~/picture/a.jpg");
namedWindow('a_window',WINDOW_AUTOSIZE);
imshow('a_window',src);
Mat gray;
cvtColor(src, gray, COLOR_BGR2GRAY);
imwrite("~/picture/a_gray.jpg", gray);
接下来展示如何显示图片的基本参数
int channels = src.channels();
int height = src.rows;
int width = src.cols;
当图片的像素值超过255时,可以通过如下算子进行调整
src.at<uchar>(row, col) = saturate_cast(12*9);
图像转换
src.convertTo(dst, CV_32FC3);
resize(Mat src,
Mat output,
Size(newWidth, newHeight),
interPolation);
上述的interPolation参数是插值算法,主要有如下参数设置
interPolation参数
参数
解释
备注
INTER_NEAREST
最近邻插值算法
INTER_LINEAR
双线性插值

本文详细介绍OpenCV3中常用API的应用场景与实践方法,包括图像处理基础、滤波、阈值、采样、形态学操作、边缘及轮廓检测、模板匹配、目标追踪等内容。

2083

被折叠的 条评论
为什么被折叠?



