openCV常用算子整理(背诵版)

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

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

双线性插值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值