Opencv图像识别从零到精通(4)----cMake与源代码与image watch
来源:互联网 发布:布列根和妇女医院 知乎 编辑:程序博客网 时间:2024/05/21 09:07
其实在学习opencv图像的时候,不是那么需要看源代码。但是还是有想学习一下的人,所以就写出来如何去看源代码,其实名字应该是代码追踪,就是我们在设置断点调试的时候,可以看到内部的定义,一堆一堆,在后面会送上imshow()与imread()的源代码可以用来欣赏学习。
自己看了好多教程,重载了一次软件还,终于能够F11到自己想要的源代码了
vs2010, cmake2.8, opencv2.4.9,这是需要的东西,估计大家都有,没有或者下不到的可以私信或者留言索要,这里就不多说了。
第一步要生产源代码
(1) 运行解压的camke文件,在bin文件夹下运行cmake-gui.exe
( 2) 在where is the source code:选择路径为D:\Program Files\opencv\sources(就是你解压opencv的路径,一般教 程都是这个位置)
下面的路径,就自己选择了,《随意》 ,我的是F:\opencv
(3)先点一次configure,然后选择编译器,我的是vs2010,所以选visual studio 10(如果不是自己根据实际选 择),等出现configuring done 然后再点一次configure 再等出现configuring done,然后点击generate,出现 configuring done.
这个完成就可以看到很多的源代码了,文章就是 《 随意》那里的路径,我的就在F:\opencv,然后打开这个文件夹,找到opencv.sln打开看到下图
左边那些点开,找到src文件夹,里面就是源文件,那么如何对应呢?例如上一篇的imread(),他的源代码在higngui模块下的,loadsave.cpp,估计要是从这么多的模块和代码下面找,需要很大的功夫,那么怎么实现快速的方法吗?这个也是折磨死我了,方式就是需要再配置一点东西。
(1)首先要设置一个启动项,为什么呢?其实目的不是太大,主要是因为如果你不设置的话,默认的是ALL_BUILD作为启动项,要选中install这个,因为后面后用这个文件夹,然后你就弹出错误提示了,可以尝试,看到错误了,然后再设置一个启动,看上图右击,选择设为启动项目
(2)分别在Dudug 和Release模式下进行调试,这个时间挺长的,耐心等待,知道出现 xxxx个成功,0个失败,0个最新,2个模式下都是这样的
(3)设置环境变量,F:\opencv\bin\Debug 和 F:\opencv\bin\Release,这里因为我压缩到F:\opencv所以参考着写,添加环境变量的方法和第一节中方法一样,可以回顾看一下
(4)下面也是差不多,就是要添加包含目录和库目录
VC++ 目录 -> 包含目录, VC++ 目录 -> 库目录进行设置:
F:\opencv\install\include
F;\opencv\install\include\opencv
F:opencv\install\include\opencv2
VC++ 目录 ->库目录:F:opencv\lib\Debug
(5)链接器->输入->附加依赖项处添加:一堆的东西,这个和第一节中加的东西是一样的很长,这些省略,可以去第一节那里复制进行粘贴
下面设置断点就可以看到imread(),其实imread()没有什么主要是imread_()
先看一下imread()
然后是Imread_()
就是这样一层一层的拨开你的心,哈哈
上图和源代码
static void*imread_( const string& filename, int flags, int hdrtype, Mat* mat=0 ){ IplImage* image = 0; CvMat *matrix = 0; Mat temp, *data = &temp; ImageDecoder decoder = findDecoder(filename); if( decoder.empty() ) return 0; decoder->setSource(filename); if( !decoder->readHeader() ) return 0; CvSize size; size.width = decoder->width(); size.height = decoder->height(); int type = decoder->type(); if( flags != -1 ) { if( (flags & CV_LOAD_IMAGE_ANYDEPTH) == 0 ) type = CV_MAKETYPE(CV_8U, CV_MAT_CN(type)); if( (flags & CV_LOAD_IMAGE_COLOR) != 0 || ((flags & CV_LOAD_IMAGE_ANYCOLOR) != 0 && CV_MAT_CN(type) > 1) ) type = CV_MAKETYPE(CV_MAT_DEPTH(type), 3); else type = CV_MAKETYPE(CV_MAT_DEPTH(type), 1); } if( hdrtype == LOAD_CVMAT || hdrtype == LOAD_MAT ) { if( hdrtype == LOAD_CVMAT ) { matrix = cvCreateMat( size.height, size.width, type ); temp = cvarrToMat(matrix); } else { mat->create( size.height, size.width, type ); data = mat; } } else { image = cvCreateImage( size, cvIplDepth(type), CV_MAT_CN(type) ); temp = cvarrToMat(image); } if( !decoder->readData( *data )) { cvReleaseImage( &image ); cvReleaseMat( &matrix ); if( mat ) mat->release(); return 0; } return hdrtype == LOAD_CVMAT ? (void*)matrix : hdrtype == LOAD_IMAGE ? (void*)image : (void*)mat;}
Mat imread( const string& filename, int flags ){ Mat img; imread_( filename, flags, LOAD_MAT, &img ); return img;}
想学习源代码的,以后就可以方便的看了,深刻理解更为重要。
最后看一个又一个实用的工具,Image watch,是让你感觉到matlab的形象感觉,下面图片一看就明白
Image Watch可进行的操作包括:
1. 放大、缩小图像;
2. 将图像保存到指定的目录;
3. 显示图像大小、通道数;
4. 拖拽图像;
5. 可以查看指定坐标的像素值(按照在内存中的顺序显示);
6. Link Views:所有相同尺寸的图像共享一个视图;
7. 像素值以十六进制显示还是十进制显示;
8. 在Watch窗口可对图像进行的操作包括(Image Watch包括Locals和Watch两个窗口):
(1)、提取指定通道图像:@band(img, number);
(2)、对指定图像进行阈值化:@thresh(img, threshold);
(3)、对图像像素值进行取绝对值操作:@abs(img);
(4)、对图像像素值进行缩放操作:@scale(img, factor);
(5)、通过1/255方式缩放像素值操作:@norm8(img);
(6)、沿y轴水平flip:@fliph(img);
(7)、沿x轴垂直flip:@flipv(img);
(8)、对图像进行矩阵转置操作:@flipd(img);
(9)、对图像进行顺时针90、180、270度操作:@rot90(img)、@rot180(img)、@rot270(img);
(10)、计算两幅图像的像素差值:@diff(img0, img1);
(11)、载入图像:@file(path),如 @file(“d:\1.jpg”);
(12)、将指定的内存地址内容按照指定的图像格式显示出来:@mem(address, type, channels, width, height, stride),如@mem(0x00000000003d1050,UINT8, 3, 256, 256, 768 );
Image Watch的更详细介绍可参考:http://research.microsoft.com/en-us/um/redmond/groups/ivm/imagewatchhelp/imagewatchhelp.htm
图像识别算法交流 QQ群:145076161,欢迎图像识别与图像算法,共同学习与交流
- Opencv图像识别从零到精通(4)----cMake与源代码与image watch
- Opencv图像识别从零到精通(10)-----直方图均衡化与直方图拉伸
- Opencv图像识别从零到精通(13)----点线圆矩形与鼠标事件
- Opencv图像识别从零到精通(22)-----hough变换检测直线与圆
- Opencv图像识别从零到精通(25)------区域分裂与合并
- Opencv图像识别从零到精通(23)----轮廓
- Opencv图像识别从零到精通(26)---分水岭
- Opencv图像识别从零到精通(27)---grabcut
- Opencv图像识别从零到精通(28)----Kmeans
- Opencv图像识别从零到精通(34)---SIFI
- Opencv图像识别从零到精通(35)---SURF
- Opencv图像识别从零到精通(1)------- 安装教程与调试显示成功
- Opencv图像识别从零到精通(6)----访问图像像素
- Opencv图像识别从零到精通(7)----图像平移、旋转、镜像
- Opencv图像识别从零到精通(31)----图像修补,分离合并通道
- Opencv图像识别从零到精通(2)-----准备知识
- Opencv图像识别从零到精通(8)-----灰度直方图
- Opencv图像识别从零到精通(9)----对比度亮度改变
- adb相关
- FreeSwitch Event Socket Command(事件套接字命令行)
- uboot 详细注释讲解
- Android WiFi开发 博客链接
- [心得]传统IT转互联网面试经验分享
- Opencv图像识别从零到精通(4)----cMake与源代码与image watch
- java网络socket编程(三)之ServerSocket服务器端
- ImageLoader源码分析
- API - PtOSContainer
- Linux QT环境的搭建
- LeetCode Ugly Number II(丑数的计算)
- NodeJS学习系列课程笔记(NodeJs Assert断言测试)
- Android实现点击两次返回键退出
- HttpClient设置HTTP请求头Header