Opencv图像识别从零到精通(3)———单图像显示和多图像显示
2016-07-12 20:53
531 查看
其实,对于图像显示,对于我们在安装调试opencv的时候,就是作为一个例子,相信看到第三节的话,应该有了正确的配置环境,还有就是对opencv的结构有了一定的理解,那么下面就是进去图像处理的阶段,但是为了更好的学习,所以用已经见过而且能够实现的例子来说问题,相信更加让你感觉到亲近吧。
说实话,即使显示成功了一张图片,但是你对里面的东西也不知道的,只有好好的理解,那么到了出现错误的时候才可以更快的找到解决的办法,这样慢慢养成习惯,到了以后的项目中,就不会在小问题上大费周章,下面正式进去图像显示。
一、图像显示的代码
简要看一下,这三个显示图像的例子
第一个是最简洁最方便的
第二个是官方文档的例子
第三个是老版的例子
二、整体功能说明
看到上面的三个例子,要分别说一下
(1)第一个,显然让你回忆到了上一篇说的Mat,这里也是可以写成Mat srcimage=imread("lena.jpg");对于这个看上一篇的Mat 就明白了,那么对于这个路径问题,一般对于入门来说,都会出现问题,官方说: this is unless you give a full, explicit path as parameter for the I/O functions. Before stating up the application
make sure you place you place the image file in your current working directory.就是如果我们没有写全路径,只是写了一个图像的名字的话,那么这个图像要放在我们当前我们工作的路径下,刚开始可能找不到,但是你可以记住,这个图像在和.cpp文件是要在一起的。如下图
![](http://img.blog.csdn.net/20160712203322653)
(2)第二个例子,我们发现了一个不一样的地方就是出现了argv【1】,举出这个例子是为了相应第二节中出现的准备知识,理论可以看上一篇,那么这个在这里是什么意思呢,怎么用呢?其实你要知道,这一个路径,是引用了一个常字符串,简单说,你需要自己配置一个命令参数,说明一下这个argv[1]代表了什么,具体的方法就是对于项目右击--属性----配置属性---调试---命令参数---lena.jpg
![](http://img.blog.csdn.net/20160712203733833)
(3)第三个其实用opencv2的人经常用,但是现在学的话,一般都是用Mat,但是还是要说一下,因为可能在看例子或者其他的资料会出现, 主要是这句 IplImage* pImg; 这个是声明IplImage指针
三、常见的问题
(1)当我们刚开始接触的时候,一个是路径问题,那么上面已经用三个例子来说明了,这里就不重复了。
(2)还有一个问题就是,一闪而过 end far too quickly的问题,这个问题在你自己写代码,不是复制粘贴别人的代码的时候,刚开始都会遇到,是因为少了 waitKey(0),zero means to wait forever,这个可以等待鼠标键盘敲击然后退出,也就是让结果显示一会,然后等待下一个命令。
(3) 还有一个问题就是出现下图的
![](http://img.blog.csdn.net/20160712204319814)
解决的方法就是把Release改成Debug,这个两个的调试原理和区别可以自搜一下,这里简略
![](http://img.blog.csdn.net/20160712204453592)
四、类与函数
(1)Mat imread(const string& filename, intflags=1)
第一个参数,const string&类型的filename,填我们需要载入的图片路径名。
第二个参数,int类型的flags,为载入标识,它指定一个加载图像的颜色类型。可以看到它自带缺省值1.所以有时候这个参数在调用时我们可以忽略,在看了下面的讲解之后,我们就会发现,如果在调用时忽略这个参数,就表示载入三通道的彩色图像。下面是可以选择的类型
(2) void nameWindow(const string& winname, int flags=WINDOUW_AUTOSIZE)
for this you need to specity its name and how it should handle the change of the image it contains from a size point of view.
第一个参数,const string&型的name,即填被用作窗口的标识符的窗口名称。
第二个参数,int 类型的flags ,窗口的标识,可以填如下的值:
WINDOW_NORMAL设置了这个值,用户便可以改变窗口的大小(没有限制)
WINDOW_AUTOSIZE如果设置了这个值,窗口大小会自动调整以适应所显示的图像,并且不能手动改变窗口大小。
WINDOW_OPENGL 如果设置了这个值的话,窗口创建的时候便会支持OpenGL。
(3)void imshow(const string& winname, InputArray mat);
specify the opencv window name to update and the image to use during this operation
第一个参数,const string&类型的winname,填需要显示的窗口标识名称。
第二个参数,InputArray 类型的mat,填需要显示的图像。
五、多图像显示
有时候在做图像显示的时候,会进行很多张的处理,特别是训练或者模版匹配的时候,我们要是一张一张的处理实在是太慢了,于是我们需要一次读取多张图,你可以一张一张的 imread(),但是明显不是什么好方法,再没有深入学习访问像素的时候,我们可以通过一个简单的方法来看,就是循环for,代码如下
![](http://img.blog.csdn.net/20160715103635434)
六、Matlab 辅助
以前用的matlab比较多,最后会来一个matlab实现,matlab比较直观的表示,其实opencv也是可以的,下载一个Image watch就可以了,但是文档说要vs2012以上吧,所以我就没有用,安装他的效果就是你可以看到这个图像是600*800* Uint8 这样矩阵的形式,和matlab的感觉就一样了。还是不多说了,来看看matlab怎么实现的
说实话,即使显示成功了一张图片,但是你对里面的东西也不知道的,只有好好的理解,那么到了出现错误的时候才可以更快的找到解决的办法,这样慢慢养成习惯,到了以后的项目中,就不会在小问题上大费周章,下面正式进去图像显示。
一、图像显示的代码
简要看一下,这三个显示图像的例子
第一个是最简洁最方便的
第二个是官方文档的例子
第三个是老版的例子
<span style="font-size:18px;">#include<opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> using namespace cv; int main(int argc,char** argv[]) { Mat srcimage; srcimage=imread("lena.jpg"); // srcimage=imread("../lena.jpg"); //cvnameWindow("原图显示"); imshow("原图显示",srcimage); waitKey(0); }</span>
<span style="font-size:18px;">#include<opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> #include<iostream> using namespace cv; using namespace std; int main(int argc,char **argv) { if(argc!=2) { cout<<"display image imagetoload and display"<<endl; return -1; } Mat image; image = imread(argv[1],1); // Read the file if(! image.data ) // Check for invalid input { cout << "Could not open or find the image" << endl ; return -1; } imshow( "Display window", image ); // Show our image inside it. waitKey(0); // Wait for a keystroke in the window return 0; } </span>
<span style="font-size:18px;">#include "cv.h" #include "highgui.h" int main( int argc, char** argv ) { IplImage* pImg; //argv[1] = " F:\\opencvprojects\\0 argc argv\\argcargv\\argcargv\\lena.jpg"; if( argc == 2 && (pImg = cvLoadImage( argv[1], 1)) != 0 ) { cvNamedWindow( "Image", 1 );//创建窗口 cvShowImage( "Image", pImg );//显示图像 cvWaitKey(0); //等待按键 cvDestroyWindow( "Image" );//销毁窗口 cvReleaseImage( &pImg ); //释放图像 return 0; } </span>
二、整体功能说明
看到上面的三个例子,要分别说一下
(1)第一个,显然让你回忆到了上一篇说的Mat,这里也是可以写成Mat srcimage=imread("lena.jpg");对于这个看上一篇的Mat 就明白了,那么对于这个路径问题,一般对于入门来说,都会出现问题,官方说: this is unless you give a full, explicit path as parameter for the I/O functions. Before stating up the application
make sure you place you place the image file in your current working directory.就是如果我们没有写全路径,只是写了一个图像的名字的话,那么这个图像要放在我们当前我们工作的路径下,刚开始可能找不到,但是你可以记住,这个图像在和.cpp文件是要在一起的。如下图
(2)第二个例子,我们发现了一个不一样的地方就是出现了argv【1】,举出这个例子是为了相应第二节中出现的准备知识,理论可以看上一篇,那么这个在这里是什么意思呢,怎么用呢?其实你要知道,这一个路径,是引用了一个常字符串,简单说,你需要自己配置一个命令参数,说明一下这个argv[1]代表了什么,具体的方法就是对于项目右击--属性----配置属性---调试---命令参数---lena.jpg
(3)第三个其实用opencv2的人经常用,但是现在学的话,一般都是用Mat,但是还是要说一下,因为可能在看例子或者其他的资料会出现, 主要是这句 IplImage* pImg; 这个是声明IplImage指针
三、常见的问题
(1)当我们刚开始接触的时候,一个是路径问题,那么上面已经用三个例子来说明了,这里就不重复了。
(2)还有一个问题就是,一闪而过 end far too quickly的问题,这个问题在你自己写代码,不是复制粘贴别人的代码的时候,刚开始都会遇到,是因为少了 waitKey(0),zero means to wait forever,这个可以等待鼠标键盘敲击然后退出,也就是让结果显示一会,然后等待下一个命令。
(3) 还有一个问题就是出现下图的
解决的方法就是把Release改成Debug,这个两个的调试原理和区别可以自搜一下,这里简略
四、类与函数
(1)Mat imread(const string& filename, intflags=1)
第一个参数,const string&类型的filename,填我们需要载入的图片路径名。
第二个参数,int类型的flags,为载入标识,它指定一个加载图像的颜色类型。可以看到它自带缺省值1.所以有时候这个参数在调用时我们可以忽略,在看了下面的讲解之后,我们就会发现,如果在调用时忽略这个参数,就表示载入三通道的彩色图像。下面是可以选择的类型
<span style="font-size:18px;">enum { /* 8bit, color or not */ CV_LOAD_IMAGE_UNCHANGED =-1, /* 8bit, gray */ CV_LOAD_IMAGE_GRAYSCALE =0, /* ?, color */ CV_LOAD_IMAGE_COLOR =1, /* any depth, ? */ CV_LOAD_IMAGE_ANYDEPTH =2, /* ?, any color */ CV_LOAD_IMAGE_ANYCOLOR =4 }; </span>
(2) void nameWindow(const string& winname, int flags=WINDOUW_AUTOSIZE)
for this you need to specity its name and how it should handle the change of the image it contains from a size point of view.
第一个参数,const string&型的name,即填被用作窗口的标识符的窗口名称。
第二个参数,int 类型的flags ,窗口的标识,可以填如下的值:
WINDOW_NORMAL设置了这个值,用户便可以改变窗口的大小(没有限制)
WINDOW_AUTOSIZE如果设置了这个值,窗口大小会自动调整以适应所显示的图像,并且不能手动改变窗口大小。
WINDOW_OPENGL 如果设置了这个值的话,窗口创建的时候便会支持OpenGL。
(3)void imshow(const string& winname, InputArray mat);
specify the opencv window name to update and the image to use during this operation
第一个参数,const string&类型的winname,填需要显示的窗口标识名称。
第二个参数,InputArray 类型的mat,填需要显示的图像。
五、多图像显示
有时候在做图像显示的时候,会进行很多张的处理,特别是训练或者模版匹配的时候,我们要是一张一张的处理实在是太慢了,于是我们需要一次读取多张图,你可以一张一张的 imread(),但是明显不是什么好方法,再没有深入学习访问像素的时候,我们可以通过一个简单的方法来看,就是循环for,代码如下
#include <iostream> #include <stdio.h> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> int main() { const int num = 2; char fileName[10]; char windowName[10]; cv::Mat srcImage; for( int i = 1; i <= num; i++ ) { sprintf_s(fileName, "%d.jpg", i); sprintf_s(windowName, "1-%d", i); srcImage = cv::imread(fileName); cv::namedWindow(windowName); cv::imshow(windowName,srcImage); std::cout << "NO" << i << std::endl; /* 以后想处理,或者保存都在这里添加,这里只是显示*/ } cv::waitKey(0); return 0; }
六、Matlab 辅助
以前用的matlab比较多,最后会来一个matlab实现,matlab比较直观的表示,其实opencv也是可以的,下载一个Image watch就可以了,但是文档说要vs2012以上吧,所以我就没有用,安装他的效果就是你可以看到这个图像是600*800* Uint8 这样矩阵的形式,和matlab的感觉就一样了。还是不多说了,来看看matlab怎么实现的
<span style="font-size:18px;">I=imread('lena.jpg'); figure imshow(I)</span>有没有发现框架是一样的呢,这个就是opencv升级以后很多的函数都是通用的感觉一样,不像以前CV_LOAD_IMAGE什么的,很长很不通用,看到这里是不是感觉,慢慢的走进了图像识别的世界,有了很大的兴趣呢?
相关文章推荐
- 在Eclipse中配置Tomcat7.0
- linux防止DDoS攻击
- java.lang.NoClassDefFoundError: Could not initialize class org.apache.log4j.Log4
- nginx+keepalived构建高可用服务
- Kali linux安装漏洞扫描工具Nessus指南
- curl 获取请求时长
- redhat yum配置CentOS的源
- adb shell dumpsys的使用
- Linux可执行文件的启动及命令行参数和环境变量的传递
- linux常用命令详解
- Linux下*.tar.gz文件解压缩命令
- UVA 12295 Optimal Symmetric Paths 最短路求方案数
- Ubuntu下安装软件的几种方式
- 运行tomcat7w.exe tomcat7.exe ,提示 指定的服务未安装 unable to open the service 'tomcat7'
- 分布式网站架构后续:zookeeper技术浅析
- 内核管理实战之虚地址转换为物理地址
- 【Linux】FrameBuffer操作入门
- CentOS 7安装JDK
- nginx专题
- opencv2.4.9+vs2010+win64下的配置