图像的读取和显示
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main(){
Mat MyImage=imread("DOTA.jpg");
if(!MyImage.data){
cout<<"读取不到图片"<<endl;
return 0;
}
namedWindow("小黑");
imshow("小黑",MyImage);
waitKey(0);
return 1;
}
结果如下:
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main(){
Mat MyImage=imread("DOTA.jpg");
if(!MyImage.data){
cout<<"读取不到图片"<<endl;
return 0;
}
namedWindow("小黑");
imshow("小黑",MyImage);
waitKey(0);
return 1;
}
我们从头往下看程序。
第一行和第二行程序包含了opcv2库里面的两个重要的模块:core和highgui两个模块。
opencv2库包含如下模块:
core模块,包含核心功能,尤其是底层数据结构和算法函数。
imgproc模块,包含图像处理函数。
highgui模块,包含读写图像及视频的函数,以及操作图形用户界面函数。
features2d模块,包含兴趣点检测子、描述子以及兴趣点匹配框架。
calib3d模块,包含相机标定、双目几何估算以及立体视觉函数。
video模块,包含运动估算、特征跟踪以及前景提取函数与类。
objdetect模块,包含物体检测函数,如脸部与行人检测。
ml模块,机器学习模块。
还包含一些其他的模块。这些模块帮我们很容易地处理图像,当然首先你要了解模块中一些函数的应用。
程序的第三行和第四行,C++的标准输入输出以及使用std命名空间。
程序的第五行,使用CV命名空间,这样做的好处是在后面的程序中,不用再写cv::imread,cv::namedWindow,cv::
imshow,直接写imread,namedWindow,imshow。
程序的第八行,读取图像,并且把图像数据存入到Mat类中。imread函数的介绍。
cv::Mat image;这句话是将创建宽,高都是为0的图像(因为这是还没给他赋值)。Mat是一个结构体,从根本上来讲的话,一幅图像可以由一个由数值组成的像素矩阵表示。opencv2用cv::Mat这个数据结构来表示图片。矩阵的每一个元素都表示一个像素。该方法的返回值是一个结构体,包含着宽度和高度。我们可以通过调用cv::Mat size()方法来获取该图像的尺寸;
std::cout<<"size,"<<image.size().height <<","<<image.size().width<<endl;
cv::Mat类是用于保存图像以及其他矩阵数据的数据结构。默认情况下,它们的尺寸是0,但是我们也可以指定初始尺寸:
cv::Mat image(240,320,CV_8U,cv::Scalar(100));
其中这里的CV_8U表示的是对应的像素值是8位无符号类型。对于彩色图像,你需要指定3个通道(CV_8UC3)。还有CV_16SC3或者CV_32F。
现在再来讲讲cv::imread("图片名“)。它的功能是读入一个图片,图片的类型可以是jpg,jpeg,bmp,png等。
程序的第九行到第十行的意思是:如果MyImage.data为0的话,就输出“读取不到图片”。这是因为成员data事实上是指向已经分配好的内存块的指针,包括图像数据。当数据不存在时,它就简单的被设置成0;故我们可以通过这样的方法来检验图片是否传入好。
对于第十二行,主要是用来创建一个窗口,图片就是显示在这个窗口中,“小黑”是这个窗口的名字.。注意named
Window中前一个W是大写的。
十三行:imshow()是用来显示图片的,它有两个参数,第一个参数是窗口的名字(图片就是这个窗口中显示),第二个参数是要显示的图片名字。
接下来介绍一下waitKey(0):这句话的意思是显示图片过后等待多长时间,其中参数如果设置成0,或者负数的话,那图片不会消失,会一直等待,直到我们去按下一个键,如果设置成一个正数的n话,表示图片会显示n毫秒后关闭。
最后,如果你希望讲处理过后的图像保存在磁盘中,这通过下下面的highgui函数得以实现:
cv::imwrite("output.bmp",result);文件的后缀决定了图像的保存时的编码格式。
注意事项::
如果按上述编写的话出项错误的话,有可能是你的图片位置放得不对。建议将图片放在debug文件外面(即与debug处于一个文件内),如果你不是放在那里,你可以这样试试(”..//图片名“)。或者(..图片名)或者(../图片名);