学习记录
学习原因是一门课程的考核要求:实现5*5的字符识别,建议使用C语言。
一. 头文件及基础函数调用
#include <opencv2/opencv.hpp>
调用OpenCV函数,需要在每个函数前加上cv::
为了避免,使用
using namespace cv;
1.1 入门函数
1. imread
imread函数//
如:
Mat imp=imread(const string,int flag)
//参数1为要打卡的文件位置,2为标志位用于选择读取图片的方式,默认值为IMREAD_COLOR,flag值的设定与用什么颜色格式读取图片有关
2. 数据类型
cv::Mat//自带结构
3. namewindow与imshow
cv::namewindow("窗口名称",窗口设置)//新建一个屏幕上的窗口
cv::imshow("窗口名称",窗口显示的mat变量)//在屏幕上显示窗口
使用范例:打开一个窗口显示文件
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
Mat img=imread("文件位置",1);
namedWindow("example",WINDOW_AUTOSIZE);
imshow("example", img);
waitKey(0);
destroyWindow("example");
return 0;
}
4. GaussianBlur
加上高斯模糊:
变化代码:
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
Mat img=imread("图片位置",1);
namedWindow("example",WINDOW_AUTOSIZE);
namedWindow("example2",WINDOW_AUTOSIZE);
imshow("example", img);
Mat out;
GaussianBlur(img, out, Size(5,5), 3,3);
GaussianBlur(out, out, Size(5,5), 3,3);
imshow("example2", out);
waitKey(0);
destroyWindow("example");
destroyWindow("example2");
return 0;
}
5. pyrUp和pyrDown来实现图像金字塔功能
6. cvtColor()
cvtColor()函数用于实现图像的色彩空间转换,一般包括四个参数,
cvtColor(src,dst,type,channels);
即源图像,目标图像,转换方,目标图像通道数
7. Canny边缘检测
包括
1.图像降噪
2.计算图像梯度
3.非极大值抑制
4.阈值筛选
例子:
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
Mat img_rgb,img_gry,img_cny,img_pyr,img_pyr2;
namedWindow("natrue",WINDOW_AUTOSIZE);
namedWindow("gray",WINDOW_AUTOSIZE);
namedWindow("canny",WINDOW_AUTOSIZE);
img_rgb=imread("文件位置",1);
imshow("natrue", img_rgb);
cvtColor(img_rgb, img_gry, COLOR_BGR2BGRA);
imshow("gray", img_gry);
Canny(img_gry, img_cny, 10, 100,3,true);
imshow("canny", img_cny);
waitKey(0);
return 0;
}
8. 数据类型
uchar: unsigned char,无符号字符,数值范围为0~255。
Mat类中的data成员是一个unsigned char *,指向数据的第一个字节。
cv::Vex<>:容器类、固定向量类
Vec2i:两个元素的int型向量
Vec4d:四个元素的double型向量
Vec3b:可以看作是vector<uchar, 3>:是一个uchar类型的,长度为3的vector向量。
b:unsigned char
w:unsigned short
s:short
由于在OpenCV中,使用imread读取到的Mat图像数据,都是用uchar类型的数据存储,对于RGB三通道的图像,每个点的数据都是一个Vec3b类型的数据。使用at定位方法如下:
img.at(row, col)[0] = 255; // 这是指修改B通道数据
img.at(row, col)[1] = 255; // 这是指修改G通道数据
img.at(row, col)[2] = 255; // 这是指修改R通道数据
cv::Matx<行数,列数,数据类型>: 固定矩阵类
cv::Point: 容器,成员x,y
cv::Scalar:
cv::Size: 两个成员,width和height
cv::Rect: 矩形类,包含point类xy(矩形左上角)及size类width和height(矩形大小)
cv::Ptr: 智能指针
……