OpenCV的简单使用教程(C++)
- OpenCV简介
- OpenCV的使用基础
- 打开、显示和保存图像
- 图像存储变量 Mat类
- 图像元素的存储
- 读入图像文件
- 创建Mat类
- 复制Mat类
- 图像元素的访问
- OpenCV画图
- 命令行交互界面
OpenCV简介
OpenCV是一个开源发行的跨平台计算机视觉和机器学习软件库,提供了图像处理和计算机视觉方面的很多通用算法。接下来,我简要介绍一些OpenCV基础且常用的函数(C++接口)。
OpenCV的使用基础
在这里,我就不讲OpenCV的配置问题了。在使用OpenCV接口时,记得在代码开头的预处理命令部分加入:
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
为了方便和编写可读性高、简洁的代码,墙裂建议使用命名空间:
using namespace cv;
当然,也可以不使用命名空间,但是在使用时需自己写cv,例如:
cv::Mat img;
打开、显示和保存图像
打开图像:imread 显示图像:imshow 保存图像:imwrite 例如:
int main()
{
char imageName[] = "/test.jpg";
Mat M=imread(imageName,IMREAD_COLOR);
if(M.empty())
{
fprintf(stderr, "Can not load image %s\n", imageName);
waitKey(6000);
return -1;
}
imshow("image",M);
waitKey();
imwrite("pic.bmp",M);
return 0;
}
图像存储变量 Mat类
Mat类包括两个数据部分
(1)矩阵头:大小恒定,包括矩阵大小、存储方法、矩阵存储地址等信息
(2)矩阵指针:大小不定,指向包含了像素值的矩阵(可选择存储方法,采用任何维度存储数据)
int depth = M.depth();
int channels = M.channels();
int nRows = M.rows;
int nCols = M.cols;
uchar * data = M.data;
int nDims = M.dims;
int nElSize = M.elemSize();
int nElSize1 = M.elemSize1();
int type = M.type();
Type:枚举类型
type的命名格式为CV_(位数)+(数据类型)+(通道数)
图像元素的存储
1.单通道灰度图 (像素通常为< uchar >类型)
2.RGB三通道彩色图 (像素通常为< Vec3b >类型)
注意事项:①行号、列号都是从“0”开始;②RGB彩色图的通道顺序反过来了,在OpenCV中是BGR。
读入图像文件
读入图像使用imread函数,用法如下:
Mat M;
M = imread(argv[1], IMREAD_COLOR);
函数声明
Mat imread(const string& filename, int flags);
IMREAD_UNCHANGED -1
IMREAD_GRAYSCALE 0
IMREAD_COLOR 1
IMREAD_ANYDEPTH 2
IMREAD_ANYCOLOR 4
缺省值为1
创建Mat类
使用Mat函数可以创建图像矩阵,并可指定大小
Mat M;
M.create(4,4, CV_8UC2);
cout << "M = "<< endl << " " << M << endl << endl;
Mat M(2,2, CV_8UC3, Scalar(0,0,255));
cout << "M = " << endl << " " << M << endl << endl;
system(" pause ");
(构造3维矩阵时,需先定义一个数组,说明每个维度的尺寸)
int sz[3] = {3,3,3};
Mat M(3,sz,CV_8UC1,Scalar::all(0));
Mat M = Mat::eye(4, 4, CV_64FC2);
Mat M = Mat::ones(2, 2, CV_32F);
Mat M = Mat::zeros(3,3, CV_8UC1);
Mat M = (Mat_<double>(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
Mat_<double> 对应 CV_64F; Mat_<uchar>对应 CV_8U
Mat_<char>对应 CV_8S; Mat_<int>对应 CV_32S
Mat_<float>对应 CV_32F; Mat_<double>对应 CV_64F
Mat M = Mat(3, 2, CV_8UC3);
cv::randu(M, Scalar::all(0), Scalar::all(255));
Mat M(height, width, CV_8UC3, pixels);
复制Mat类
当需要复制图像或者生成一张与原图像大小的新图像时,要用使用复制Mat类
Mat B(A);
C = A;
Mat D(A, Rect(0,0,2,3));
Mat E = A(Range::all(),Range(0,3));
Mat F = A.clone();
Mat G;
A.copyTo(G);
图像元素的访问
因为灰度图像和彩色图像的通道数不一样,所以两者的访问方式不一样,需要注意。下面我主要讲解彩色图像元素的访问(三通道),灰度图像的访问只需要单通道和用Mat.at< uchar >(j,i)访问即可。
访问方式有三种:data指针、Mat.at(i,j)和Mat.ptr行指针
unsigned char* ptr=M.data;
int height = M.rows;
int width = M.cols;
for (int i=0; i<height; i++)
{
for (int j=0; j<width; j++)
{
ptr[ (i *width +j)*3 +0]=ptr[ (i *width +j)*3 +0]/2;
ptr[ (i *width +j)*3 +1]=ptr[ (i *width +j)*3 +1]/2;
ptr[ (i *width +j)*3 +2]=ptr[ (i *width +j)*3 +2]/2;
}
}
int height = M.rows;
int width = M.cols;
for (int i=0; i<height; i++)
{
for (int j=0; j<width; j++)
{
M.at<Vec3b>(i,j)[0] = M.at<Vec3b>(i,j)[0]*i*j/(height*width);
M.at<Vec3b>(i,j)[1] = M.at<Vec3b>(i,j)[1]*i*j/(height*width);
M.at<Vec3b>(i,j)[2] = M.at<Vec3b>(i,j)[2]*i*j/(height*width);
}
}
int height = M.rows;
int width = M.cols;
Vec3b* p;
for (int i=0; i<height; i++) {
p = M.ptr<Vec3b>(i);
for (int j=0; j<width; j++){
p[j][0] = p[j][0]*i*j/(height*width);
p[j][1] = p[j][1]*i*j/(height*width);
p[j][2] = p[j][2]*i*j/(height*width);
}
}
OpenCV画图
使用OpenCV可以画出很多的基本图形,应有尽有,比如:画圆、画直线、插入文字等。
Point center = Point(255,255);
int r = 100;
circle(M,center,r,Scalar(0,0,0));
imshow(“显示图像",img);
Size s=Size(20,10);
ellipse(M,center,s,0,10,180,Scalar(0,0,0));
Point a = Point(600,600);
line(M,a,center,Scalar(255,0,0));
rectangle(M,a,center,Scalar(255,0,0));
string words= "good luck";
putText(M,words,Point(M.rows/2,M.cols/4),CV_FONT_HERSHEY_COMPLEX,1,Scalar(255,0,0));
命令行交互界面
OpenCV提供了相关函数,有助于编写交互程序
带输入参数的可执行命令
int main(int argc,char*argv[])
对于 int _tmain(int argc, _TCHAR* argv[])
需设值项目属性的generalcharacter setUse Multi-Byte Character Set
Mat img=imread(argv[1],IMREAD_ANYCOLOR);
在Solution Explore中右键项目(或选中项目后点project菜单)
Properties --> Configuration Properties -> Debugging
在Command Arguments中,输入入口参数(如C:\news.jpg),参数间以空格隔开
打开项目的debug目录(xxx.exe所在目录)
空白处“Shift+右键”,选择“在此处打开命令窗口”
输入项目名及参数,如 xxx C:\news.jpg
执行过程中的命令行输入交互
cout<<"请选择操作 [1] xx; [2] xx\n";
int x;
cin>>x;
string imagename;
if (x == 1)
{ cout<<"请输入图片文件名“<<endl;
cin>>imagename;
Mat img=imread(imagename,IMREAD_COLOR);
….
}
更多详细的OpenCV函数说明,请移步官方文档:
https://docs.opencv.org/3.4/d6/d00/tutorial_py_root.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)