文档视界 最新最全的文档下载
当前位置:文档视界 › 学习OpenCV标准Hough变换函数

学习OpenCV标准Hough变换函数

学习OpenCV标准Hough变换函数
学习OpenCV标准Hough变换函数

学习OpenCV标准Hough变换函数

2009-12-17 22:52:31| 分类:OLD | 标签:hough变换opencv|字号订阅

Hough变换找直线的程序实在是做得纠结,看原理似乎很简单,但实际做起来还是碰到了不少问题。最主要的就是当theta-rho空间中有几个相邻点的计数值都超过阈值时的取舍问题,整了一下午还是想不出很么好办法。晚上抱着敬畏的心理读了以下OpenCV的源码,感觉受益匪浅。

首先眼前一亮的是cos值和sin值的计算,icvHoughLinesStandard的处理方式是先把所有要用的都计算出来,存到数组里面。这样以来就避免了大量的重复计算,这对提高Hough变换的效率大有帮助。

接着看到的就是那个令我纠结的问题,这里先贴一下OpenCV中的代码:

int base = (n+1) * (numrho+2) + r+1;

if( accum[base] > threshold &&

accum[base] > accum[base - 1] && accum[base] >= accum[base + 1]

&&

accum[base] > accum[base - numrho - 2] && accum[base] >=

accum[base + numrho + 2] )

sort_buf[total++] = base;

如果仅仅通过累加器中的值是否大于阈值来判断数据的有效性不能达到令人满意的效果,因此还比较了当前累加器单元及其四邻域的值,这样能够近似的到一个令人满意的结果。起初以为这么做存在一个小BUG: 当两个相等的accum值挨在一起时,若它们又比周围其它值都要大,那么这条直线就被水掉了。后来发现每个元素与其右或下的元素比较时用的是“>=”而不是">",这样就保证了不会丢失直线,不过精度有所下降——如果要保证精度,需要大大增加计算量,故这里的精度损失也是可接受的。

这个函数一共标注了4个stage,第三个是一个排序,起初不解,后来明白当遇到linesMax <= total的情况时,这一个步骤保证了把"最像直线的直线"输出。

附:读代码时做的注释src/cv/cvhough.cpp

......

static void

icvHoughLinesStandard( const CvMat* img, float rho, float theta,

int threshold, CvSeq *lines, int linesMax )

{

int *accum = 0;

int *sort_buf=0;

float *tabSin = 0;

float *tabCos = 0;

CV_FUNCNAME( "icvHoughLinesStandard" );

__BEGIN__;

const uchar* image;

int step, width, height;

int numangle, numrho;

int total = 0;

float ang;

int r, n;

int i, j;

float irho = 1 / rho;

double scale;

CV_ASSERT( CV_IS_MAT(img) && CV_MAT_TYPE(img->type) == CV_8UC1 );

/* 指向矩阵数据的uchar *指针*/

image = img->data.ptr;

/* 以字节为单位的行数据长度*/

step = img->step;

/* 以元素为单位的行数据长度*/

width = img->cols;

/* 行数,即高度*/

height = img->rows;

/* 通过弧度精度计算出来的弧度分块数目*/

numangle = cvRound(CV_PI / theta);

/* 通过像素精度计算出来的像素分块数目*/

numrho = cvRound(((width + height) * 2 + 1) / rho);

/* 补充: cvRound是取整函数,返回和参数最接近的整数值*/

/* 分配存储空间*/

/* 这里给accum多分配了一圈的空间,是为了方便后面用3*3的模板做运算*/

CV_CALL( accum = (int*)cvAlloc( sizeof(accum[0]) * (numangle+2) * (numrho+2) )); CV_CALL( sort_buf = (int*)cvAlloc( sizeof(accum[0]) * numangle * numrho ));

CV_CALL( tabSin = (float*)cvAlloc( sizeof(tabSin[0]) * numangle ));

CV_CALL( tabCos = (float*)cvAlloc( sizeof(tabCos[0]) * numangle ));

/* 将累加器矩阵清零*/

memset( accum, 0, sizeof(accum[0]) * (numangle+2) * (numrho+2) );

/* 建立Sin和Cos查询表,以提高运算效率*/

for( ang = 0, n = 0; n < numangle; ang += theta, n++ )

{

/* 由于后面每一步都有正弦/余弦除以rho的运算,故这里一并做了*/

tabSin[n] = (float)(sin(ang) * irho);

tabCos[n] = (float)(cos(ang) * irho);

}

// stage 1. fill accumulator

/* 第一步,计算累加器中个元素的值*/

for( i = 0; i < height; i++ )

for( j = 0; j < width; j++ )

{

/* 若某一像素的灰度值不为0,则计算相应的弧度-到原点的距离值*/

if( image[i * step + j] != 0 )

for( n = 0; n < numangle; n++ )

{

/* 对每一个n值,查表计算r值*/

r = cvRound( j * tabCos[n] + i * tabSin[n] );

r += (numrho - 1) / 2;

accum[(n+1) * (numrho+2) + r+1]++;

}

}

// stage 2. find local maximums

/* 第二布,遍历累加器,找出符合要求的值来*/

for( r = 0; r < numrho; r++ )

for( n = 0; n < numangle; n++ )

{

int base = (n+1) * (numrho+2) + r+1;

/*

* 仅仅通过累加器中的值是否大于阈值来判断数据的有效性不能达到令人满

* 意的效果,因此还比较了当前累加器单元及其四邻域的值,这一点很重要

*/

if( accum[base] > threshold &&

accum[base] > accum[base - 1] && accum[base] >= accum[base + 1] &&

accum[base] > accum[base - numrho - 2] && accum[base] >=

accum[base + numrho + 2] )

sort_buf[total++] = base;

}

// stage 3. sort the detected lines by accumulator value

/* 对结果进行排序,这么做是为下面的linesMax

那种情况下需要保证把计数值最大的linesMax个线条输出*/

icvHoughSortDescent32s( sort_buf, total, accum );

// stage 4. store the first min(total,linesMax) lines to the output buffer

/* 存结果*/

/*

* 推测下面一行是为了防止溢出,当然也可用来限制找到的最大直线数目

* 不过若处于后面一个目的,似乎在第二步中就限定total不能超过linesMax更好*/

linesMax = MIN(linesMax, total);

scale = 1./(numrho+2);

for( i = 0; i < linesMax; i++ )

{

/* 定义一条标准式表示的直线,计算出rho和angle参数并压栈*/

CvLinePolar line;

int idx = sort_buf[i];

int n = cvFloor(idx*scale) - 1;

int r = idx - (n+1)*(numrho+2) - 1;

line.rho = (r - (numrho - 1)*0.5f) * rho;

line.angle = n * theta;

cvSeqPush( lines, &line );

}

__END__;

/* 终于OVER了,读的第一段OpenCV代码:-),纪念一下: 2009.12.17 */

/* 当然不能忘了释放内存*/

cvFree( &sort_buf );

cvFree( &tabSin );

cvFree( &tabCos );

cvFree( &accum );

}

......

/* Wrapper function for standard hough transform */

CV_IMPL CvSeq*

cvHoughLines2( CvArr* src_image, void* lineStorage, int method,

double rho, double theta, int threshold,

double param1, double param2 )

{

CvSeq* result = 0;

CV_FUNCNAME( "cvHoughLines" );

__BEGIN__;

CvMat stub, *img = (CvMat*)src_image;

CvMat* mat = 0;

CvSeq* lines = 0;

CvSeq lines_header;

CvSeqBlock lines_block;

int lineType, elemSize;

int linesMax = INT_MAX;

int iparam1, iparam2;

/* 错误检测*/

CV_CALL( img = cvGetMat( img, &stub ));

/* 待处理图像的像素位数是否为8位*/

if( !CV_IS_MASK_ARR(img))

CV_ERROR( CV_StsBadArg, "The source image must be 8-bit, single-channel" );

/* lineStorage是否为空*/

if( !lineStorage )

CV_ERROR( CV_StsNullPtr, "NULL destination" );

/* 两个精度、一个阈值均应大于0 */

if( rho <= 0 || theta <= 0 || threshold <= 0 )

CV_ERROR( CV_StsOutOfRange, "rho, theta and threshold must be positive" );

/* 根据处理方式定lineType与elemSize的值*/

if( method != CV_HOUGH_PROBABILISTIC )

{

lineType = CV_32FC2;

elemSize = sizeof(float)*2;

}

else

{

lineType = CV_32SC4;

elemSize = sizeof(int)*4;

}

/* 确定lineStorage是合法的STORAGE类型*/

if( CV_IS_STORAGE( lineStorage ))

{

CV_CALL( lines = cvCreateSeq( lineType, sizeof(CvSeq), elemSize, (CvMemStorage*)lineStorage ));

}

/* 若不是,则判断是否MAT */

else if( CV_IS_MAT( lineStorage ))

{

/*

* 若不曾进这个分支,则mat==0,函数走到最后的if...else分支时,

* 将进入else,对应此处的前一个分支

*/

mat = (CvMat*)lineStorage;

if( !CV_IS_MAT_CONT( mat->type ) || (mat->rows != 1 && mat->cols != 1) )

CV_ERROR( CV_StsBadArg,

"The destination matrix should be continuous and have a single row or a single column" );

if( CV_MAT_TYPE( mat->type ) != lineType )

CV_ERROR( CV_StsBadArg,

"The destination matrix data type is inappropriate, see the manual" );

CV_CALL( lines = cvMakeSeqHeaderForArray( lineType, sizeof(CvSeq), elemSize, mat->data.ptr,

mat->rows + mat->cols - 1,

&lines_header, &lines_block ));

linesMax = lines->total;

CV_CALL( cvClearSeq( lines ));

}

/* 若都不是则表示出错了*/

else

{

CV_ERROR( CV_StsBadArg, "Destination is not CvMemStorage* nor CvMat*" );

}

iparam1 = cvRound(param1);

iparam2 = cvRound(param2);

/* Hough变换至此才正式开始,依据method值使用不同的Hough变换策略*/

switch( method )

{

case CV_HOUGH_STANDARD:

CV_CALL( icvHoughLinesStandard( img, (float)rho,

(float)theta, threshold, lines, linesMax ));

break;

case CV_HOUGH_MULTI_SCALE:

CV_CALL( icvHoughLinesSDiv( img, (float)rho, (float)theta,

threshold, iparam1, iparam2, lines, linesMax ));

break;

case CV_HOUGH_PROBABILISTIC:

CV_CALL( icvHoughLinesProbabalistic( img, (float)rho, (float)theta,

threshold, iparam1, iparam2, lines, linesMax ));

break;

default:

CV_ERROR( CV_StsBadArg, "Unrecognized method id" );

}

if( mat )

{

if( mat->cols > mat->rows )

mat->cols = lines->total;

else

mat->rows = lines->total;

}

else

{

result = lines;

}

__END__;

return result;

}

OpenCV主要函数介绍

4.1 OpenCV主要函数介绍 1) cvLoadImage 从文件中读取图像 IplImage* cvLoadImage(const char* filename,int flags=CV_LOAD_IMAGE_COLOR ); 函数cvLoadImage从指定文件读入图像,返回读入图像的指针。其中filename是要被读入的文件的文件名;flags指定读入图像的颜色和深度。 2)cvSaveImage 保存图像到文件 int cvSaveImage( const char* filename, const CvArr* image ); 函数cvSaveImage保存图像到指定文件。其中filename保存文件名。image 要保存的图像。图像格式的的选择依赖于filename的扩展名,只有8位单通道或者3通道(通道顺序为'BGR' )可以使用这个函数保存。 3)cvQueryFrame从摄像头或者文件中抓取并返回一帧 IplImage* cvQueryFrame( CvCapture* capture ); 函数cvQueryFrame从摄像头或者文件中抓取一帧,然后解压并返回这一帧。这个函数仅仅是函数cvGrabFrame和函数cvRetrieveFrame在一起调用的组合。返回的图像不可以被用户释放或者修改。其中capture视频获取结构。。 4)cvCaptureFromCAM 初始化摄像头 CvCapture* cvCaptureFromCAM( int index ); 函数cvCaptureFromCAM给从摄像头的视频流分配和初始化CvCapture结构。 其中index要使用的摄像头索引。如果只有一个摄像头或者用哪个摄像头也无所谓,那使用参数-1应该便可以。 5)cvHaarDetectObjects 用来检测图像中的人脸区域 CV API(CvSeq*) cvHaarDetectObjects( const CvArr* image, CvHaarClassifierCascade* cascade, CvMemStorage* storage, double scale_factor CV_DEFAULT(1.1), int min_neighbors CV_DEFAULT(3), int flags CV_DEFAULT(0), CvSize min_size CV_DEFAULT(cvSize(0,0)), CvSize max_size CV_DEFAULT(cvSize(0,0))); 用于快速检测人脸区域,便于提取得到人脸数据。其中image 为被检图像,cascade为 haar分类器级联的内部标识形式,storage 为用来存储检测到的一

opencv函数目录-Cv图像处理

目录 1 梯度、边缘和角点 1.1 Sobel 1.2 Laplace 1.3 Canny 1.4 PreCornerDetect 1.5 CornerEigenValsAndVecs 1.6 CornerMinEigenVal 1.7 CornerHarris 1.8 FindCornerSubPix 1.9 GoodFeaturesToTrack 2 采样、插值和几何变换 2.1 InitLineIterator 2.2 SampleLine 2.3 GetRectSubPix 2.4 GetQuadrangleSubPix 2.5 Resize 2.6 WarpAffine 2.7 GetAffineTransform 2.8 2DRotationMatrix 2.9 WarpPerspective 2.10 WarpPerspectiveQMatrix 2.11 GetPerspectiveTransform 2.12 Remap 2.13 LogPolar 3 形态学操作 3.1 CreateStructuringElementEx 3.2 ReleaseStructuringElement 3.3 Erode 3.4 Dilate 3.5 MorphologyEx 4 滤波器与色彩空间变换 4.1 Smooth 4.2 Filter2D 4.3 CopyMakeBorder 4.4 Integral 4.5 CvtColor 4.6 Threshold 4.7 AdaptiveThreshold 5 金字塔及其应用 5.1 PyrDown 5.2 PyrUp 6 连接部件 6.1 CvConnectedComp

OPENCV库函数使用说明

OPENCV(Intel Open Source Computer Vision Library)是一种数字图像处理和计算机视觉的函数库,由Intel公司微处理器实验室(Intel’s Microprocessor Research Lab)的视觉交互组(The Visual Interactivity Group)开发。它可以在Windows系统、Linux系统、MacOSx系统等操作平台上使用,也可以和其他编程工具结合,以满足不同的使用要求。使用OPENCV使用C/C++编写,包含300多个图像处理函数,有以下几个对立的子库组成: 1.CXCORE:一些基本函数(各种数据类型的基本运算等) 2.CV:图像处理和计算机视觉算法(图像处理、结构分析、运动分析、物体跟 踪和模式识别等) 3.HIGHGUI:用户交互部分(图形界面,图像视频输入输出,系统调用函数) 4.CVAUX:一些实验性的函数(三维跟踪等) 在这些库函数的支持下,用户可以直接调用滤波函数,形态学处理,图像特征提取,轮廓提取算法和跟踪算法,也可以添加自己编写的子函数,不但能完成复杂的开发任务,还可以提高效率,达到事半功倍的效果。 OPENCV的重要特性: 1.拥有包括300多个C函数的跨平台的中、高层API。它不依赖于其他的外部库——尽管也可以使用某些外部库。 2.对非商业应用和商业应用都是免费(FREE)的。 3.为Integrated Performance Primitives(IPP)提供了透明的接口。这意味着如果有为特定处理器优化的IPP库,OPENCV将在运行时自动加载这些库。 在VC++环境中OPENCV的使用设置: Microsoft公司开发的Visual C++是一种具有高度综合性能的软件开发工具。用它开发出的程序具有运行速度快,可移植能力强等优点,在对数字图像处理进行处理时经常采用Visual C++进行编程,通过对VC进行配置,就可以在编程过程中直接使用OPENCV的函数编写代码,减少了工作量,提高了运行效率。 在OPENCV安装完成后,首先需要把它的路径加入到系统环境变量中,然后再VC菜单Tools→Options→Directories下设置Library files路径,再选择Source files,最后选择Include files,就可以加入路径,如错误!未找到引用源。所示。设置完成后,就可以新建或打开一个使用OPENCV的工程。 打开工程后,选择菜单Project→Settings,然后将Setting for选为All Configurations,再选择右边的link标签,在Object/library modules加上工程属性中使用的库,这样就可以顺利编程。

OPENCV函数

Opencv函数 分配图像空间: IplImage*cvCreateImage(CvSize size,int depth,int channels); size:cvSize(width,height); depth:IPL_DEPTH_8U,IPL_DEPTH_8S,IPL_DEPTH_16U, IPL_DEPTH_16S,IPL_DEPTH_32S,IPL_DEPTH_32F, IPL_DEPTH_64F channels:1,2,3or4. 注意数据为交叉存取.彩色图像的数据编排为b0g0r0b1g1 r1... 举例: //分配一个单通道字节图像 IplImage*img1=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); //分配一个三通道浮点图像 IplImage*img2=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3); 释放图像空间: IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); cvReleaseImage(&img); 复制图像: IplImage*img1=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); IplImage*img2; img2=cvCloneImage(img1); 设定/获取兴趣区域: void cvSetImageROI(IplImage*image,CvRect rect); void cvResetImageROI(IplImage*image); vRect cvGetImageROI(const IplImage*image); 大部分OpenCV函数都支持ROI. 设定/获取兴趣通道: void cvSetImageCOI(IplImage*image,int coi);//0=all int cvGetImageCOI(const IplImage*image); 大部分OpenCV函数暂不支持COI.

OPenCV3.2中Mat对象常用函数属性总结

OPenCV3.2中Mat对象常用函数属性总结Mat对象是OpenCV2.0之后引进的图像数据结构,它能自动分配内存、不存在内存泄漏的问题,是面向对象的数据结构。分了两个部分,头部与数据部分。 在使用Mat对象时,有以下四个要点需要注意: 1、输出图像的内存是自动分配的 2、使用OpenCV的C++接口,不需要考虑内存分配问题 3、赋值操作和拷贝构造函数只会复制头部分 4、使用clone与copyTo两个函数实现数据完全复制 下面我们就具体介绍一下公共成员函数和公共属性。 公共成员函数: 1、cv::Mat::Mat ( int rows, int cols, int type ) 参数: rows2D数组中的行数 cols2D数组中的列数。 type数组类型。使用CV_8UC1,…,CV_64FC4创建1 - 4通道矩阵,或CV_8UC(n),…,CV_64FC(n)创建多通道(向上到CV_CN_MAX通道)矩阵。

2、cv::Mat::Mat ( Size size, int type ) 参数: size 2D数组大小:Size(cols, rows)。在Size()构造函数中,行数和列数以相反的顺序排列。 type 数组类型。使用CV_8UC1,…,CV_64FC4创建1 - 4通道矩阵,或CV_8UC(n),…,CV_64FC(n)创建多通道(向上到CV_CN_MAX通道)矩阵。 3、cv::Mat::Mat ( int rows, int cols, int type, const Scalar & s ) 参数: rows2D数组中的行数。 cols 2D数组中的列数。 type数组类型。使用CV_8UC1,…,CV_64FC4创建1 - 4通道矩阵,或CV_8UC(n),…,CV_64FC(n)创建多通道(向上到CV_CN_MAX通道)矩阵。s 初始化每个矩阵元素的可选值。在构建后将所有矩阵元素设置为特定值, 使用赋值运算符Mat::operator=(const Scalar& value) 。 4、cv::Mat::Mat ( Size size, int type,

快速学习OPENCV常用函数

访问图像元素如下: 1、针对各种图像(包括4-通道)和矩阵的函数(cvGet2D,cvSet2D),但是它们都很慢. (img->origin=IPL_ORIGIN_TL)或者是左下角(img->origin=IPL_ORIGIN_BL) 假设有8-bit1-通道的图像I(IplImage*img): I(x,y)~((uchar*)(img->imageData+img->widthStep*y))[x] 假设有8-bit3-通道的图像I(IplImage*img): I(x,y)blue~((uchar*)(img->imageData+img->widthStep*y))[x*3] I(x,y)green~((uchar*)(img->imageData+img->widthStep*y))[x*3+1] I(x,y)red~((uchar*)(img->imageData+img->widthStep*y))[x*3+2] 如果增加点(100,100)的亮度30,那么可以: CvPoint pt={100,100}; ((uchar*)(img->imageData+img->widthStep*pt.y))[pt.x*3]+=30; ((uchar*)(img->imageData+img->widthStep*pt.y))[pt.x*3+1]+=30; ((uchar*)(img->imageData+img->widthStep*pt.y))[pt.x*3+2]+=30; CvPoint pt={100,100}; uchar*temp_ptr=&((uchar*)(img->imageData+ img->widthStep*pt.y))[x*3]; temp_ptr[0]+=30; temp_ptr[1]+=30; temp_ptr[2]+=30; 假设有32-bit浮点数,1-通道图像I(IplImage*img): I(x,y)~((float*)(img->imageData+img->widthStep*y))[x] 现在,通用方法:假设有N-通道,类型为T的图像: I(x,y)c~((T*)(img->imageData+img->widthStep*y))[x*N+c] 或者你可使用宏CV_IMAGE_ELEM(image_header,elemtype,y,x_Nc) I(x,y)c~CV_IMAGE_ELEM(img,T,y,x*N+c) 2、访问矩阵元素 设有32-bit浮点数的实数矩阵M(CvMat*mat): M(i,j)~((float*)(mat->data.ptr+mat->step*i))[j] 设有64-bit浮点数的复数矩阵M(CvMat*mat): Re M(i,j)~((double*)(mat->data.ptr+mat->step*i))[j*2] Im M(i,j)~((double*)(mat->data.ptr+mat->step*i))[j*2+1]

OpenCV最基础的图像处理的例子

?什么是OpenCV ?开源C/C++计算机视觉库. ?面向实时应用进行优化. ?跨操作系统/硬件/窗口管理器. ?通用图像/视频载入、存储和获取. ?由中、高层API构成. ?为Intel?公司的Integrated Performance Primitives (IPP) 提供了透明接口. ?特性: ?图像数据操作(分配,释放, 复制, 设定, 转换). ?图像与视频I/O (基于文件/摄像头输入, 图像/视频文件输出). ?矩阵与向量操作与线性代数计算(相乘, 求解, 特征值, 奇异值分解SVD). ?各种动态数据结构(列表, 队列, 集, 树, 图). ?基本图像处理(滤波, 边缘检测, 角点检测, 采样与插值, 色彩转换, 形态操作, 直方图, 图像金字塔). ?结构分析(连接成分, 轮廓处理, 距离转换, 模板匹配, Hough转换, 多边形近似, 线性拟合, 椭圆拟合, Delaunay三角化). ?摄像头标定 (寻找并跟踪标定模板, 标定, 基础矩阵估计, homography估计, 立体匹配). ?动作分析(光流, 动作分割, 跟踪). ?对象辨识 (特征方法, 隐马可夫链模型HMM). ?基本GUI(显示图像/视频, 键盘鼠标操作, 滚动条). ?图像标识 (直线, 圆锥, 多边形, 文本绘图) ?OpenCV 模块: ?cv - OpenCV 主要函数. ?cvaux - 辅助(实验性) OpenCV 函数. ?cxcore - 数据结构与线性代数算法. ?highgui - GUI函数. 资料链接 ?参考手册: ?/docs/index.htm ?网络资源: ?官方网页: https://www.docsj.com/doc/bf5603412.html,/technology/computing/opencv/?软件下载: https://www.docsj.com/doc/bf5603412.html,/projects/opencvlibrary/ ?书籍: ?Open Source Computer Vision Library by Gary R. Bradski, Vadim Pisarevsky, and Jean-Yves Bouguet, Springer, 1st ed. (June, 2006). ?视频处理例程(位于/samples/c/目录中): ?色彩跟踪: camshiftdemo ?点跟踪: lkdemo

opencv最基础的图像处理

openCV——几个实用函数 2010年12月20日星期一 09:18 1. cvSmooth:各种方法的图像平滑 void cvSmooth( const CvArr* src, CvArr* dst, int smoothtype=CV_GAUSSIAN, int param1=3, int param2=0, double param3=0 ); src 输入图像. dst 输出图像. smoothtype 平滑方法: . CV_BLUR_NO_SCALE (简单不带尺度变换的模糊) - 对每个象素的param1×param2 领域求和。如果邻域大小是变化的,可以事先利用函数cvIntegral 计算积分图像。 . CV_BLUR (simple blur) - 对每个象素param1×param2邻域求和并做尺度变换 1/(param1.param2). . CV_GAUSSIAN (gaussian blur) - 对图像进行核大小为 param1×param2 的高斯卷积 . CV_MEDIAN (median blur) - 对图像进行核大小为 param1×param1 的中值滤波 (i.e. 邻域是方的). . CV_BILATERAL (双向滤波) - 应用双向 3x3 滤波,彩色 sigma=param1,空间 sigma=param2. 平滑操作的第一个参数. param2 平滑操作的第二个参数. 对于简单/非尺度变换的高斯模糊的情况,如果 param2的值为零,则表示其被设定为param1。 param3

对应高斯参数的 Gaussian sigma (标准差). 如果为零,则标准差由下面的核尺寸计算: sigma = (n/2 - 1)*0.3 + 0.8, 其中 n=param1 对应水平核, n=param2 对应垂直核. 对小的卷积核 (3×3 to 7×7) 使用如上公式所示的标准 sigma 速度会快。如果 param3 不为零,而 param1 和 param2 为零,则核大小有sigma 计算 (以保证足够精确的操作). 函数 cvSmooth 可使用上面任何一种方法平滑图像。每一种方法都有自己的特点以及局限。 没有缩放的图像平滑仅支持单通道图像,并且支持8位到16位的转换(与cvSobel和cvaplace相似)和32位浮点数到32位浮点数的变换格式。 简单模糊和高斯模糊支持 1- 或 3-通道, 8-比特和 32-比特浮点图像。这两种方法可以(in-place)方式处理图像。 中值和双向滤波工作于 1- 或 3-通道, 8-位图像,但是不能以 in-place 方式处理图像. 2.IplImage结构 由于OpenCV主要针对的是计算机视觉方面的处理,因此在函数库中,最重要的结构体是IplImage结构。IplImage结构来源于Intel的另外一个函数库Intel Image Processing Library (IPL),该函数库主要是针对图像处理。IplImage结构具体定义如下: typedef struct _IplImage { int nSize; /* IplImage大小 */ int ID; /* 版本 (=0)*/

Opencv中函数的用法

1、cvLoadImage:将图像文件加载至内存; 2、cvNamedWindow:在屏幕上创建一个窗口; 3、cvShowImage:在一个已创建好的窗口中显示图像; 4、cvWaitKey:使程序暂停,等待用户触发一个按键操作; 5、cvReleaseImage:释放图像文件所分配的内存; 6、cvDestroyWindow:销毁显示图像文件的窗口; 7、cvCreateFileCapture:通过参数设置确定要读入的AVI文件; 8、cvQueryFrame:用来将下一帧视频文件载入内存; 9、cvReleaseCapture:释放CvCapture结构开辟的内存空间; 10、cvCreateTrackbar:创建一个滚动条; 11、cvSetCaptureProperty:设置CvCapture对象的各种属性; 12、cvGetCaptureProperty:查询CvCapture对象的各种属性; 13、cvGetSize:当前图像结构的大小; 14、cvSmooth:对图像进行平滑处理; 15、cvPyrDown:图像金字塔,降采样,图像缩小为原来四分之一; 16、cvCanny:Canny边缘检测; 17、cvCreateCameraCapture:从摄像设备中读入数据; 18、cvCreateVideoWriter:创建一个写入设备以便逐帧将视频流写入视频文件;搜索 19、cvWriteFrame:逐帧将视频流写入文件; 20、cvReleaseVideoWriter:释放CvVideoWriter结构开辟的内存空间; 21、CV_MAT_ELEM:从矩阵中得到一个元素; 22、cvAbs:计算数组中所有元素的绝对值;

OPENCV图像处理常用函数

图像处理和图像识别中常用的OpenCV函数 2011-02-21 19:25:42|分类:默认分类|字号订阅 1、cvLoadImage:将图像文件加载至内存; 2、cvNamedWindow:在屏幕上创建一个窗口; 3、cvShowImage:在一个已创建好的窗口中显示图像; 4、cvWaitKey:使程序暂停,等待用户触发一个按键操作; 5、cvReleaseImage:释放图像文件所分配的内存; 6、cvDestroyWindow:销毁显示图像文件的窗口; 7、cvCreateFileCapture:通过参数设置确定要读入的AVI文件; 8、cvQueryFrame:用来将下一帧视频文件载入内存; 9、cvReleaseCapture:释放CvCapture结构开辟的内存空间; 10、cvCreateTrackbar:创建一个滚动条; 11、cvSetCaptureProperty:设置CvCapture对象的各种属性; 12、cvGetCaptureProperty:查询CvCapture对象的各种属性; 13、cvGetSize:当前图像结构的大小; 14、cvSmooth:对图像进行平滑处理; 15、cvPyrDown:图像金字塔,降采样,图像缩小为原来四分之一; 16、cvCanny:Canny边缘检测; 17、cvCreateCameraCapture:从摄像设备中读入数据; 18、cvCreateVideoWriter:创建一个写入设备以便逐帧将视频流写入视频文件; 19、cvWriteFrame:逐帧将视频流写入文件; 20、cvReleaseVideoWriter:释放CvVideoWriter结构开辟的内存空间; 21、CV_MAT_ELEM:从矩阵中得到一个元素;

OpenCV常用函数说明

OpenCV基础篇中的常用函数说明: (1)函数名: cvActionTargetMod(...) Action = 核心功能(core functionality) (e.g. set, create) Target = 目标图像区域(target image area) (e.g. contour, polygon) Mod = (可选的)调整语(optional modifiers) (e.g. argument type) (2)矩阵数据类型: CV_(S|U|F)C S = 符号整型 U = 无符号整型 F = 浮点型 E.g.: CV_8UC1 是指一个8位无符号整型单通道矩阵, CV_32FC2是指一个32位浮点型双通道矩阵. (3)图像数据类型: IPL_DEPTH_(S|U|F) E.g.: IPL_DEPTH_8U 图像像素数据是8位无符号整型. IPL_DEPTH_32F图像像素数据是32位浮点型. (4)头文件: #include #include #include #include #include // 一般不需要,cv.h 内已包含该头文件 4、编译建议 (1)Linux: g++ hello-world.cpp -o hello-world / -I /usr/local/include/opencv -L /usr/local/lib / -lm -lcv -lhighgui -lcvaux (2)Windows: 在Visual Studio的‘选项’和‘项目’中设置好OpenCV相关文件的路径。 5、C例程

Matlab 到 OpenCv 的常见函数转换

1、 matlab中的imread相当于OpenCV中的cvLoadImage(imageName, CV_LOAD_IAMGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR):读出的图像信息保持了原有图像的信息(包括通道信息和位深信息); rgb2gray相当于cvLoadImage(imageName, CV_LOAD_IMAGE_GRAYSCALE):单通道灰度图; 或用cvCreateImage、cvCvtColor两函数实现图像的灰度化。 2、matlab中的zeros函数相当于OpenCV中的cvSetZero函数。 3、matlab中的两矩阵点乘 .* 相当于OpenCV中的cvMul函数。 4、matlab中的两矩阵点除 ./ 相当于OpenCV中的cvDiv函数。 5、matlab中的两矩阵相加 + 相当于OpenCV中的cvAdd函数。 6、matlab中的两矩阵相减 - 相当于OpenCV中的cvSub函数。 7、matlab中的矩阵和一个常量相加 A + a 相当于OpenCV中的cvAddS函数 cvAdds(matA, cvScalar(a), matB)。 8、matlab中的矩阵和一个常量相减 A - a 相当于OpenCV中的cvSubS函数 cvSubS(matA, cvScalar(a), matB)。

9、matlab中的给矩阵赋一初值 A(:, :) = a 相当于OpenCV中的cvSet函数 cvSet(matA, cvScalar(a))。 10、matlab中取矩阵某一部分赋给另一矩阵 A = B(i : j, m : n) 相当于OpenCV中的cvGetSubRect 函数,cvGetSubRect(mat1, mat2, rect)。 11、matlab中取矩阵最大值、最小值 max(max(A))、min(min(A)) 相当于OpenCV中的cvMinMaxLoc函数 cvMinMaxLoc(A, minloc, maxloc)。 12、matlab中两矩阵相乘 A * B 相当于OpenCV中的cvMatMul函数,cvMatMul(A, B, C)。 13、matlab中计算两个三维向量的叉积 C = cross(A, B) 相当于OpenCV中的cvCrossProduct 函数,cvCrossProduct(A, B, C)。 14、matlab中计算向量的范数 c = norm(A) 相当于OpenCV中的cvNorm函数,c = cvNorm(A)。 15、matlab中求二维矩阵的奇异值分解 [u s v] = svd(A, 0) 相当于OpenCV中的cvSVD函数cvSVD(A, s, u, v)。 16、matlab中两矩阵左除 c = a / b 相当于OpenCV中的cvInvert、cvMatMul两函数即:cvInvert(a, d); cvMatMul(d, b, c)。 17、matlab中的求矩阵的逆inv函数 A = inv(B) 相当于OpenCV中的cvInvert函数:cvInvert(B,A)。

基本函数调用命令(python+opencv)

1图像读取和写入 1.1图片读取 [1]unread(img_path,flag) 读取图片,返回图片对象 img_path: 图片的路径,即使路径错误也不会报错,但打印返回的图片对象为None flag:读取图片的方式 cv2.IMREAD_COLOR,读取彩色图片,图片透明性会被忽略,为默认参数,也可以传入1 cv2.IMREAD_GRAYSCALE,按灰度模式读取图像,也可以传入0 cv2.IMREAD_UNCHANGED,读取图像,包括其alpha通道,也可以传入-1 1.2图片展示 [1]imshow(window_name,img):显示图片,窗口自适应图片大小 window_name: 指定窗口的名字 img:要显示的图片对象 可以指定多个窗口名称,显示多个图片 waitKey(millseconds) 键盘绑定事件,阻塞监听键盘按键,返回一个数字(不同按键对应的数字不同)。如果关闭图片窗口,则无法返回一个数字,也无法继续进行编写代码。 millseconds: 传入时间毫秒数,在该时间内等待键盘事件;传入0时,会一直等待键盘事件 [1]destroyAllWindows(window_name) window_name: 需要关闭的窗口名字,不传入时关闭所有窗口 1.3图片保存 [1]imwrite(img_path_name, img, num) img_path_name:要保存的文件名 img:要保存的图像 num:可选参数,它针对特定的格式:对于JPEG,其表示的是图像的质量,用0 - 100的整数表示,默认95;对于png ,第三个参数表示的是压缩级别,默认为3。从0到9压缩级别越高图像越小 2图像像素获取和编辑 2.1像素值获取

学习opencv平滑处理

平滑处理 平滑处理”也称“模糊处理”(blurring),是一项简单且使用频率很高的图像处理 方法。平滑处理的用途有很多,但最常见的是用来减少图像上的噪声或者失真。降 低图像分辨率时,平滑处理是很重要的(在本章的“图像金字塔”部分会详细介绍 这一点)。 目前OpenCV可以提供五种不同的平滑操作方法,所有操作都由cvSmooth函数实 尺寸调整 我们经常会将某种尺寸的图像转换为其他尺寸的图像,如放大或者缩小图像。我们 可以用cvResize()函数来放大或缩小图像。该函数可以将源图像精确转换为目标 图像的尺寸。如果源图像中设置了ROI,那么cvResize()将会对ROI区域调整 尺寸,以匹配目标图像,同样,如果目标图像中已设置ROI的值,那么 cvResize()将会将源图像进行尺寸调整并填充到目标图像的ROI中。 一般情况下,我们期望源图像和重采样后的目标图像之间的映射尽可能地平滑。参 数interpolation控制如何进行映射。当缩小图像时,目标图像的像素会映射为 源图像中的多个像素,这时需要进行插值。当放大图像时,目标图像上的像素可能 无法在源图像中找到精确对应的像素,也需要进行插值。在任何一种情况下,都有 很多z种计算像素值的方法。其中最简单的办法是将目标图像各点的像素值设为源 图像中与其距离最近的点的像素值,这就是当interpolation设为CV_工NTER一N 时用的算法。或者采用线性插值算法(CV_工NTER L工NEAR,将根据源图像附近的4 个((2x2范围)邻近像素的线性加权计算得出,权重由这4个像素到精确目标点 的距离决定。我们也可以用新的像素点覆盖原来的像素点,然后求取覆盖区域 的平均值,这种插值算法称为区域插值。。最后一种选择是三次样条插值 (Cv一工NTER CUBIC。首先对源图像附近的4x4个邻近像素进行三次样条拟 合,然后将目标像素对应的三次样条值作为目标图像对应像素点的值。 图像金字塔 图像金字塔[Adelson84]被广泛用于各种视觉应用中。图像金字塔是一个图像集 合,集合中所有的图像都源于同一个原始图像,而且是通过对原始图像连续降采样 获得,直到达到某个中止条件才停止降采样。(当然,降为一个像素肯定是中止条件。)[i307 有两种类型的图像金字塔常常出现在文献和应用中:高斯金字塔【Rosenfeld80〕和拉 普拉斯[Burt83]金字塔[Adelson84]。高斯金字塔用来向下降采样图像,而拉普拉斯 金字塔(后面会简单讨论)则用来从金字塔低层图像中向上采样重建一个图像。 要从金字塔第i层生成第i+ 1层(我们表示第i+ 1层为Gi+、),我们先要用高斯核对G…进行卷积,然后删除所有偶数行和偶数列。当然,新得到的图像面积会变为源 图像的四分之一。按上述过程对输入图像Go循环执行操作就可产生整个金字塔。OpenCV为我们提供了从金字塔中上一级图像生成下一级图像的方法: 在这种情况下,图像首先在每个维度上扩大为原来的两倍,新增的行(偶数行)以0

opencv应用函数

目录 1 一、简介 1.1 1、OpenCV的特点 1.1.1 (1)总体描述 1.1.2 (2)功能 1.1.3 (3)OpenCV模块 1.2 2、有用的学习资源 1.2.1 (1)参考手册: 1.2.2 (2)网络资源: 1.2.3 (3)书籍: 1.2.4 (4)视频处理例程(在/samples/c/): 1.2.5 (5)图像处理例程(在/samples/c/): 1.3 3、OpenCV 命名规则 1.3.1 (1)函数名: 1.3.2 (2)矩阵数据类型: 1.3.3 (3)图像数据类型: 1.3.4 (4)头文件: 1.4 4、编译建议 1.4.1 (1)Linux: 1.4.2 (2)Windows: 1.5 5、C例程 2 二、GUI 指令 2.1 1、窗口管理 2.1.1 (1)创建和定位一个新窗口: 2.1.2 (2)载入图像: 2.1.3 (3)显示图像: 2.1.4 (4)关闭窗口: 2.1.5 (5)改变窗口大小: 2.2 2、输入处理 2.2.1 (1)处理鼠标事件: 2.2.2 (2)处理键盘事件: 2.2.3 (3)处理滑动条事件: 3 三、OpenCV的基本数据结构 3.1 1、图像数据结构 3.1.1 (1)IPL 图像: 3.2 2、矩阵与向量 3.2.1 (1)矩阵: 3.2.2 (2)一般矩阵: 3.2.3 (3)标量: 3.3 3、其它结构类型 3.3.1 (1)点:

3.3.2 (2)矩形框大小(以像素为精度): 3.3.3 (3)矩形框的偏置和大小: 4 四、图像处理 4.1 1、图像的内存分配与释放 4.1.1 (1)分配内存给一幅新图像: 4.1.2 (2)释放图像: 4.1.3 (3)复制图像: 4.1.4 (4)设置/获取感兴趣区域ROI: 4.1.5 (5)设置/获取感兴趣通道COI: 4.2 2、图像读写 4.2.1 (1)从文件中读入图像: 4.2.2 (2)保存图像: 4.3 3、访问图像像素 4.3.1 (1)假设你要访问第k通道、第i行、第j列的像素。 4.3.2 (2)间接访问: (通用,但效率低,可访问任意格式的图像) 4.3.3 (3)直接访问: (效率高,但容易出错) 4.3.4 (4)基于指针的直接访问: (简单高效) 4.3.5 (5)基于c++ wrapper 的直接访问: (更简单高效) 4.4 4、图像转换 4.4.1 (1)字节型图像的灰度-彩色转换: 4.4.2 (2)彩色图像->灰度图像: 4.4.3 (3)不同彩色空间之间的转换: 4.5 5、绘图指令 4.5.1 (1)绘制矩形: 4.5.2 (2)绘制圆形: 4.5.3 (3)绘制线段: 4.5.4 (4)绘制一组线段: 4.5.5 (5)绘制一组填充颜色的多边形: 4.5.6 (6)文本标注: 5 五、矩阵处理 5.1 1、矩阵的内存分配与释放 5.1.1 (1)总体上: 5.1.2 (2)为新矩阵分配内存: 5.1.3 (3)释放矩阵内存: 5.1.4 (4)复制矩阵: 5.1.5 (5)初始化矩阵: 5.1.6 (6)初始化矩阵为单位矩阵: 5.2 2、访问矩阵元素 5.2.1 (1)假设需要访问一个2D浮点型矩阵的第(i, j)个单元. 5.2.2 (2)间接访问: 5.2.3 (3)直接访问(假设矩阵数据按4字节行对齐): 5.2.4 (4)直接访问(当数据的行对齐可能存在间隙时possible alignment gaps):

opencv中的几种常见的图像类型

1 opencv中的几种常见的图像类型 opencv中,几种常见的图像类型有: IplImage,Mat,CvMat,CvArr CvArr : 老版本的结构了。是一个抽象基类,在函数原型中,常见到CvArr(CvArr*),这就允许吧CvMar* 或者IplImage* 传递到程序或函数参数中了。 CvMat : 矩阵结构, IplImage : 是较老版本的一种类型了,对图像进行”编码“的基本结构。这些图像可能是灰度,彩色,4通道的(RGB+ alpha),其中,每个通道可以包含任意的整数或浮点数。 Mat: 新版本中的强大的一个图像容器,是和Matlab中的函数对应的。基本上讲 Mat 是一个类,由两个数据部分组成:矩阵头(包含矩阵尺寸,存储方法,存储地址等信息)和一个指向存储所有像素值的矩阵(根据所选存储方法的不同矩阵可以是不同的维数)的指针。矩阵头的尺寸是常数值,但矩阵本身的尺寸会依图像的不同而不同,通常比矩阵头的尺寸大数个数量级。 2 opencv中存储图像类型转换 (1)将IplImage类型转换到Mat类型 Mat::Mat(const IplImage* img, bool copyData=false); 默认情况下,新的Mat类型与原来的IplImage类型共享图像数据,转换只是创建一个Mat矩阵头。当将参数copyData设为true后,就会复制整个图像数据。 例:

IplImage*iplImg = cvLoadImage("greatwave.jpg", 1); Matmtx(iplImg); // IplImage* ->Mat 共享数据 // or : Mat mtx = iplImg; (2)将Mat类型转换到IplImage类型 同样只是创建图像头,而没有复制数据。 例: IplImage ipl_img = img; // Mat -> IplImage (3)将CvMat类型转换为Mat类型 与IplImage的转换类似,可以选择是否复制数据。 Mat::Mat(const CvMat* m, bool copyData=false); (4)将Mat类型转换为CvMat类型 与IplImage的转换类似,不复制数据,只创建矩阵头。 例: // 假设Mat类型的imgMat图像数据存在 CvMat cvMat = imgMat; // Mat -> CvMat 几个例子: 为矩阵定义了一系列方便的操作符。我们可以将一个已经存在的灰度图像img变成全黑色: 选择感兴趣区域: 将Mat转为 C API 数据类型:

opencv几种常见滤波器使用方法

OpenCv中几种常见的滤波器 一. 滤波器的作用 1.问题:数字图像信号的频率分布? 回答:信号或者图像的能量大部分在中低频段,少部分有用信号在高频段被噪声淹没(噪声都是高频信号)。因此设计滤波器能降低高频成分幅度就能减弱噪声影响。 2.问题:为什么要进行图像滤波? 回答:1.适应图像处理要求,消除图像数字化时所混入的噪声。 2.提取对象的特征作为图像识别的特征模式(没遇到过!) 3.问题:如何理解滤波器? 回答:把滤波器想象成一个包含加权系数的窗口,当使用滤波器平滑处理图像时,相当于把窗口放到图像上,透过窗口看图像。 4.问题:滤波器实现的结果是怎么样的? 回答:对图像做平滑或滤波后图像变得更模糊。 二.滤波器分类 2.1线性滤波器 1.低通滤波器:允许低频率通过 2.高通滤波器:允许高频率通过 3.带通滤波器:允许一定范围频率通过 4.带阻滤波器:阻止一定范围频率通过 5.全通滤波器:允许所有频率通过,只是改变相位 2.1.1 Opencv中提供的线性滤波函数

1.方框滤波:boxFilter函数 函数原型:void boxFilter (InputArray src,OutputArray dst,int ddepth,Size ksize,Pointanchor=Point(-1,-1),boolnormalize=true,int borderType=BORDER_DEFAULT) 参数说明:InputArray,输入图像src。 OutputArray ,输出图像dst。 Int类型ddepth,输出图像深度,-1代表使用原图src 深度。 Size类型ksize,内核大小,一般用Size(w,h),w为宽度,h为深度。 Point类型anchor,被平滑的点,表示取内核中心,默认值Point(-1,-1)。 Bool类型normalize,标识符,表示内核是否被归一化。默认值为true。 Int类型boderType,推断图像外部像素的某种边界模式。默认值BORDER_DEFAULT。 2.均值滤波:blur函数 函数原型:void blur(InputArray src,OutputArray dst,int ddepth,Size ksize,Pointanchor=Point(-1,-1), int borderType=BORDER_DEFAULT) 参数说明:InputArray,输入图像src。

OpenCV的基本数据类型

OpenCV简介 OpenCV是Intel公司支持的开源计算机视觉库。它轻量级而且高效——由一系列C函数和少量C++类构成,实现了图像处理和计算机视觉方面的很多通用算法。1999年在俄罗斯设立的软件开发中心“Software Developmellt Cellter¨开发的。 OpenCV采用C/C++语言编写,可以运行在Linux/Windows/Mac等操作系统上。OpenCV还提供了Python、Ruby、MATLAB以及其他语言的接口。OpenCV 的设计目标是执行速度尽量快,主要关注实时应用。它采用优化的C代码编写,能够充分利用多核处理器的优势。如果是希望在Intel平台上得到更快的处理速度,可以购买Intel的高性能多媒体函数库IPP(Integrated Performance Primitives)。IPP库包含许多从底层优化的函数,这些函数涵盖多个应用领域。如果系统已经安装了IPP库,OpenCV会在运行时自动使用相应的IPP库。 OpenCV的一个目标是构建一个简单易用的计算机视觉框架,以帮助开发人员更便捷地设计更复杂的计算机视觉相关应用程序。OpenCV包含的函数有500多个,覆盖了计算机视觉的许多应用领域,如工厂产品检测、医学成像、信息安全、用户界面、摄像机标定、立体视觉和机器人等。因为计算机视觉和机器学习密切相关,所以OpenCV还提供了MLL(Machine Learning Library)机器学习库。该机器学习库侧重于统计方面的模式识别和聚类(clustering)。MLL除了用在视觉相关的任务中,还可以方便地应用于其他的机器学习场合。 OpenCV的基本结构 OpenCV主体分为五个模块,其中四个模块如图6-1所示。OpenCV的CV 模块包含基本的图像处理函数和高级的计算机视觉算法。ML是机器学习库,包含一些基于统计的分类和聚类工具。HighGUI包含图像和视频输入/输出的函数。CXCore包含OpenCV的一些基本数据结构和相关函数。

相关文档
相关文档 最新文档