OpenCV Demo系列文章将按照opencv2模块core、imgproc、highgui、calib3d、feature2d、video、objdetect、ml、gpu的顺序,记录和分析一些常用的函数、功能及注意事项,后期打算加入一些具体的应用实例。常用的demo将整理到github,欢迎交流与指正。
core模块(1)图像读取与显示
这篇文章将介绍opencv2中读取和显示图像的函数,作为opencv系列的第一篇文章,本文顺带介绍一下opencv2与旧版本opencv的一些区别,下面的demo会给出opencv1和opencv2的两种实现方式。
Mat
存放矩阵或者图像,包括矩阵信息头、矩阵指针。
opencv2引入的C++接口,Mat是一个类,有它的数据和函数成员。
Mat自动分配和释放内存,是opencv1到opencv2的一个巨大改进(opencv1需要手动释放内存)
读取图像,用法:imread("图像路径")
创建显示窗口,用于显示图片或者视频,用法:namedWindow("窗口名称")
显示图像,用法:imshow("用于显示的窗口名称",图像名称)
等待按键按下,并且返回按键的值。
用法:key=waitKey(delay),等待delay毫秒,期间有键按下则将其返回给key。
若delay为0或者为负,无限等待
<span style="font-size:18px;">#include<iostream> #include"opencv2\core\core.hpp" #include"opencv2\highgui\highgui.hpp" using namespace cv; using namespace std; int main(){ /*opencv2版本,矩阵结构Mat,函数imread(),nameWindow(),imshow()*/ Mat img1=imread("D:\\1.jpg"); //注意是双反斜杠,否则读不到图片 if(!img1.data) {cout<<"error1";return -1;} //检查有没有读到图片 namedWindow("图片1");//有两个参数,第二个有默认形参 imshow("图片1",img1); waitKey(10); /*opencv老版本,数据结构IplImage,函数cvLoadImage(),cvNamedWindow(),cvShowImage()*/ IplImage* img2=cvLoadImage("D:\\2.jpg"); if(!img2) {cout<<"error2";return -1;} cvNamedWindow("图片2"); cvShowImage("图片2",img2); cvWaitKey(10); cvReleaseImage(&img2); cvDestroyWindow("图片2"); //老版本opencv需要手动释放内存 return 0; }</span>
<span style="font-size:18px;">#include<iostream> #include"opencv2\core\core.hpp" #include"opencv2\highgui\highgui.hpp" using namespace cv; using namespace std; int main2(int argc,char** argv){ /*opencv2版本,矩阵结构Mat,函数imread(),nameWindow(),imshow()*/ Mat img1=imread(argv[1]); //注意是双反斜杠,否则读不到图片 if(!img1.data) {cout<<"error1";return -1;} //检查有没有读到图片 namedWindow("图片1");//有两个参数,第二个有默认形参 imshow("图片1",img1); waitKey(10); /*opencv老版本,数据结构IplImage,函数cvLoadImage(),cvNamedWindow(),cvShowImage()*/ IplImage* img2=cvLoadImage(argv[2]); if(!img2) {cout<<"error2";return -1;} cvNamedWindow("图片2"); cvShowImage("图片2",img2); cvWaitKey(10); cvReleaseImage(&img2); cvDestroyWindow("图片2"); //老版本opencv需要手动释放内存 return 0; }</span>
<span style="font-size:18px;">imgRead_Show.exe D:\\1.jpg D:\\2.jpg</span>
#include"opencv2\core\core.hpp" #include"opencv2\highgui\highgui.hpp" using namespace cv; int main(){ Mat A=imread("D:\\1.jpg"); Mat B=A; Mat C(A);/*B、C都是浅拷贝,只复制矩阵指针,它们指向的是同一个内存空间,改变其中一个,剩下的两个也会受影响*/ Mat D=A.clone(); Mat E; A.copyTo(E); /*D、E是深拷贝,将图像数据也复制了一份,改变A不会影响D、E*/ namedWindow("原来的A");imshow("原来的A",A); A=A-100; namedWindow("修改后的A");imshow("修改后的A",A); namedWindow("B");imshow("B",B); namedWindow("C");imshow("C",C); namedWindow("D");imshow("D",D); namedWindow("E");imshow("E",E); waitKey(0); return 0; }