自2011年接触OpenCV已经有几年了,一直停留在写一些小程序,利用手冊完毕一些任务,一直没有深入研究当中代码,现在毕业,但各种原因未能进入图像处理行业,故现重学OpenCV,包含分析代码,学习算法,blog不定时更写,欢迎交流。

搭建好开发环境:VS2010+CV1.0

最新CV是3.0 alpha,但1.0结构简单,基础功能还是有的,并且本人比較熟悉C语言,故选择1.0。

官网下载1.0的安装文件,系统自己主动安装到C:\Program Files (x86),进入OpenCV文件夹,会发现有一个C:\Program Files (x86)\OpenCV\_make文件夹,里面有一个OpenCV.sln文件,这个非常好辨认,用vs2010打开文件,由于是2008的project文件,所以须要转换,还好没有报错,直接生成project,使用Debug版本号,由于原版是Release的,无法单步调试。

生成项目后,会在对应文件夹下看到文件名称为d结尾的lib和dll,依据Vs配置OpenCV的原理(网上有非常多,不再赘述),至此环境完毕,仅仅要新建项目,单步调试,就能一步步的观察函数的内部结构。

#include <cv.h>
#include <highgui.h> int main()
{
IplImage * image = cvLoadImage("e:\\1.jpg",1); cvNamedWindow("原图");
cvNamedWindow("变换");
cvShowImage("原图",image);
cvSmooth(image,image,CV_GAUSSIAN,3,3,0,0);
cvShowImage("变换",image);
cvWaitKey();
cvDestroyWindow("原图");
cvDestroyWindow("变换");
cvReleaseImage(&image);
return 0;
}

调试的话进入cvSmooth:

CV_IMPL void
cvSmooth( const void* srcarr, void* dstarr, int smooth_type,
int param1, int param2, double param3, double param4 )
{
CvBoxFilter box_filter;
CvSepFilter gaussian_filter; CvMat* temp = 0; CV_FUNCNAME( "cvSmooth" ); __BEGIN__; int coi1 = 0, coi2 = 0;
CvMat srcstub, *src = (CvMat*)srcarr;
CvMat dststub, *dst = (CvMat*)dstarr;
CvSize size;
int src_type, dst_type, depth, cn;
double sigma1 = 0, sigma2 = 0;
bool have_ipp = icvFilterMedian_8u_C1R_p != 0; CV_CALL( src = cvGetMat( src, &srcstub, &coi1 ));
CV_CALL( dst = cvGetMat( dst, &dststub, &coi2 )); if( coi1 != 0 || coi2 != 0 )
CV_ERROR( CV_BadCOI, "" ); src_type = CV_MAT_TYPE( src->type );
dst_type = CV_MAT_TYPE( dst->type );
depth = CV_MAT_DEPTH(src_type);
cn = CV_MAT_CN(src_type);
size = cvGetMatSize(src); if( !CV_ARE_SIZES_EQ( src, dst ))
CV_ERROR( CV_StsUnmatchedSizes, "" ); if( smooth_type != CV_BLUR_NO_SCALE && !CV_ARE_TYPES_EQ( src, dst ))
CV_ERROR( CV_StsUnmatchedFormats,
"The specified smoothing algorithm requires input and ouput arrays be of the same type" ); if( smooth_type == CV_BLUR || smooth_type == CV_BLUR_NO_SCALE ||
smooth_type == CV_GAUSSIAN || smooth_type == CV_MEDIAN )
{
// automatic detection of kernel size from sigma
if( smooth_type == CV_GAUSSIAN )
{
sigma1 = param3;
sigma2 = param4 ? param4 : param3; if( param1 == 0 && sigma1 > 0 )
param1 = cvRound(sigma1*(depth == CV_8U ? 3 : 4)*2 + 1)|1;
if( param2 == 0 && sigma2 > 0 )
param2 = cvRound(sigma2*(depth == CV_8U ? 3 : 4)*2 + 1)|1;
} if( param2 == 0 )
param2 = size.height == 1 ? 1 : param1;
if( param1 < 1 || (param1 & 1) == 0 || param2 < 1 || (param2 & 1) == 0 )
CV_ERROR( CV_StsOutOfRange,
"Both mask width and height must be >=1 and odd" ); if( param1 == 1 && param2 == 1 )
{
cvConvert( src, dst );
EXIT;
}
} if( have_ipp && (smooth_type == CV_BLUR || smooth_type == CV_MEDIAN) &&
size.width >= param1 && size.height >= param2 && param1 > 1 && param2 > 1 )
{
CvSmoothFixedIPPFunc ipp_median_box_func = 0; if( smooth_type == CV_BLUR )
{
ipp_median_box_func =
src_type == CV_8UC1 ? icvFilterBox_8u_C1R_p :
src_type == CV_8UC3 ? icvFilterBox_8u_C3R_p :
src_type == CV_8UC4 ? icvFilterBox_8u_C4R_p :
src_type == CV_32FC1 ? icvFilterBox_32f_C1R_p :
src_type == CV_32FC3 ? icvFilterBox_32f_C3R_p :
src_type == CV_32FC4 ? icvFilterBox_32f_C4R_p : 0;
}
else if( smooth_type == CV_MEDIAN )
{
ipp_median_box_func =
src_type == CV_8UC1 ? icvFilterMedian_8u_C1R_p :
src_type == CV_8UC3 ? icvFilterMedian_8u_C3R_p :
src_type == CV_8UC4 ? icvFilterMedian_8u_C4R_p : 0;
} if( ipp_median_box_func )
{
CvSize el_size = { param1, param2 };
CvPoint el_anchor = { param1/2, param2/2 };
int stripe_size = 1 << 14; // the optimal value may depend on CPU cache,
// overhead of the current IPP code etc.
const uchar* shifted_ptr;
int y, dy = 0;
int temp_step, dst_step = dst->step; CV_CALL( temp = icvIPPFilterInit( src, stripe_size, el_size )); shifted_ptr = temp->data.ptr +
el_anchor.y*temp->step + el_anchor.x*CV_ELEM_SIZE(src_type);
temp_step = temp->step ? temp->step : CV_STUB_STEP; for( y = 0; y < src->rows; y += dy )
{
dy = icvIPPFilterNextStripe( src, temp, y, el_size, el_anchor );
IPPI_CALL( ipp_median_box_func( shifted_ptr, temp_step,
dst->data.ptr + y*dst_step, dst_step, cvSize(src->cols, dy),
el_size, el_anchor ));
}
EXIT;
}
} if( smooth_type == CV_BLUR || smooth_type == CV_BLUR_NO_SCALE )
{
CV_CALL( box_filter.init( src->cols, src_type, dst_type,
smooth_type == CV_BLUR, cvSize(param1, param2) ));
CV_CALL( box_filter.process( src, dst ));
}
else if( smooth_type == CV_MEDIAN )
{
if( depth != CV_8U || cn != 1 && cn != 3 && cn != 4 )
CV_ERROR( CV_StsUnsupportedFormat,
"Median filter only supports 8uC1, 8uC3 and 8uC4 images" ); IPPI_CALL( icvMedianBlur_8u_CnR( src->data.ptr, src->step,
dst->data.ptr, dst->step, size, param1, cn ));
}
else if( smooth_type == CV_GAUSSIAN )
{
CvSize ksize = { param1, param2 };
float* kx = (float*)cvStackAlloc( ksize.width*sizeof(kx[0]) );
float* ky = (float*)cvStackAlloc( ksize.height*sizeof(ky[0]) );
CvMat KX = cvMat( 1, ksize.width, CV_32F, kx );
CvMat KY = cvMat( 1, ksize.height, CV_32F, ky ); CvSepFilter::init_gaussian_kernel( &KX, sigma1 );
if( ksize.width != ksize.height || fabs(sigma1 - sigma2) > FLT_EPSILON )
CvSepFilter::init_gaussian_kernel( &KY, sigma2 );
else
KY.data.fl = kx; if( have_ipp && size.width >= param1*3 &&
size.height >= param2 && param1 > 1 && param2 > 1 )
{
int done;
CV_CALL( done = icvIPPSepFilter( src, dst, &KX, &KY,
cvPoint(ksize.width/2,ksize.height/2)));
if( done )
EXIT;
} CV_CALL( gaussian_filter.init( src->cols, src_type, dst_type, &KX, &KY ));
CV_CALL( gaussian_filter.process( src, dst ));
}
else if( smooth_type == CV_BILATERAL )
{
if( param1 < 0 || param2 < 0 )
CV_ERROR( CV_StsOutOfRange,
"Thresholds in bilaral filtering should not bee negative" );
param1 += param1 == 0;
param2 += param2 == 0; if( depth != CV_8U || cn != 1 && cn != 3 )
CV_ERROR( CV_StsUnsupportedFormat,
"Bilateral filter only supports 8uC1 and 8uC3 images" ); IPPI_CALL( icvBilateralFiltering_8u_CnR( src->data.ptr, src->step,
dst->data.ptr, dst->step, size, param1, param2, cn ));
} __END__; cvReleaseMat( &temp );
}

学习OpenCV第0天的更多相关文章

  1. opencv 3.0 DPM Cascade 检测 (附带TBB和openMP加速)

    opencv 3.0 DPM cascade contrib模块 转载请注明出处,楼燚(yì)航的blog,http://www.cnblogs.com/louyihang-loves-baiyan/ ...

  2. 《学习OpenCV》中求给定点位置公式

    假设有10个三维的点,使用数组存放它们有四种常见的形式: ①一个二维数组,数组的类型是CV32FC1,有n行,3列(n×3) ②类似①,也可以用一个3行n列(3×n)的二维数组 ③④用一个n行1列(n ...

  3. 《学习OpenCV》练习题第五章第二题abc

    代码: #include <stdio.h> #include <opencv/highgui.h> #include <opencv/cv.h> #include ...

  4. 《学习OpenCV》练习题第五章第一题ab

    这道题是载入一幅带有有趣纹理的图像并用不同的模板(窗口,核)大小做高斯模糊(高斯平滑),然后比较用5*5大小的窗口平滑图像两次和用11*11大小的窗口平滑图像一次是否接近相同. 先说下我的做法,a部分 ...

  5. 《学习OpenCV》练习题第四章第八题ab

    这道题是利用OpenCV例子程序里自带的人脸检测程序,做点图像的复制操作以及alpha融合. 说明:人脸检测的程序我参照了网上现有的例子程序,没有用我用的OpenCV版本(2.4.5)的facedet ...

  6. 《学习OpenCV》练习题第四章第二题

    #include <highgui.h> #include <cv.h> #pragma comment (lib,"opencv_calib3d231d.lib&q ...

  7. 《学习OpenCV》练习题第四章第一题b&c

    #include <highgui.h> #include <cv.h> #pragma comment (lib,"opencv_calib3d231d.lib&q ...

  8. 《学习OpenCV》练习题第四章第七题abc

    题外话:一直是打算把这本书的全部课后编程题写完的,中间断了几个月,一直忙于其他事.现在开始补上. 这道题我不清楚我理解的题意是不是正确的,这道题可以练习用OpenCV实现透视变换(可以用于矫正在3维环 ...

  9. 学习opencv中文版教程——第二章

    学习opencv中文版教程——第二章 所有案例,跑起来~~~然而并没有都跑起来...我只把我能跑的都尽量跑了,毕竟看书还是很生硬,能运行能出结果,才比较好. 越着急,心越慌,越是着急,越要慢,越是陌生 ...

随机推荐

  1. Delphi Socket的最好项目——FastMsg IM(还有一些IM控件),RTC,RO,Sparkle等等,FileZilla Client/Server,wireshark,NSClient

    https://www.nsclient.org/nsclient/ 好好学习,天天向上

  2. Delphi中使用GDI+进行绘图(2)

    2)使用IGDIPlus接口 (1)下载安装所需软件 可以在以下地址下载IGDI+最新的安装程序. http://www.mitov.com/products/igdi+ www.igdiplus.o ...

  3. C/C++中constkeyword

    今天在做一个趋势笔试题的时候.才让我有了系统把constkeyword好好总结一下的冲动,由于这个关键词大大小小好多地方都出现过,出现频率很高,而每次仅仅是简短的把答案看了一下,没有真正将其整个使用方 ...

  4. ios捕获异常并发送图片,便于解决bug

    在开发过程中,我们有时候会留下Bug,用户在使用我们的app 的时候,有时会出现闪退,这时候我们能够让用户给我们发送邮件,以让我们开发者更加高速的地位到Bug的所在.以最快的时间解决.同一时候也提高用 ...

  5. 多字符集(ANSI)和UNICODE及字符串处理方式准则

    在我们编写程序的时候,使用最多的是字符串的处理,而ANSI和UNICODE的相互转换经常搞的我们头晕眼乱. 应该说UNICODE是一种比较好的编码方式,在我们的程序中应该尽量使用UNICODE编码方式 ...

  6. Static关键字的作用及使用

    1.使用static声明属性 如果希望一个属性被所有对象共同拥有,可以将其声明为static类型. 声明为static类型的属性或方法,此属性或方法也被称为类方法,可以由类名直接调用. class P ...

  7. [Android阅读代码]android-async-http源码学习一

    android-async-http 下载地址 一个比较常用的Http请求库,基于org.apache.http对http操作进行封装. 特点: 1.每一个HTTP请求发生在UI线程之外,Client ...

  8. 编程算法 - 萨鲁曼的军队(Saruman&#39;s Army) 代码(C)

    萨鲁曼的军队(Saruman's Army) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 直线上有N个点, 每个点, 其距离为R以内的区域里 ...

  9. GitHub上最火的74个Android开源项目

    GitHub上最火的74个Android开源项目 1.ActionBarSherlock ActionBarSherlock应该算得上是GitHub上最火的Android开源项目了,它是一个独立的库, ...

  10. c++中sort()及qsort()的使用方法总结

    当并算法具体解释请见点我 想起来自己天天排序排序,冒泡啊,二分查找啊,结果在STL中就自带了排序函数sort,qsort,总算把自己解脱了~ 所以自己总结了一下,首先看sort函数见下表:   函数名 ...