OPENCV函数

OPENCV函数
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.

读取存储图像

从文件中载入图像:

IplImage*img=0;

img=cvLoadImage(fileName);

if(!img)printf("Could not load image file:%s\n",fileName);

Supported image formats:BMP,DIB,JPEG,JPG,JPE,PNG,PBM,PGM, PPM,

SR,RAS, TIFF,TIF

载入图像默认转为3通道彩色图像.如果不是,则需加flag:

img=cvLoadImage(fileName,flag);

flag:>0载入图像转为三通道彩色图像

=0载入图像转为单通道灰度图像

<0不转换载入图像(通道数与图像文件相同).

图像存储为图像文件:

if(!cvSaveImage(outFileName,img))printf("Could not save:

%s\n",outFileName);

输入文件格式由文件扩展名决定.

存取图像元素

假设需要读取在i行j列像点的第k通道.其中,行数i的范围为[0,height-1],列数j的范围为[0,width-1],通道k的范围为[0,nchannels-1].

间接存取:(比较通用,但效率低,可读取任一类型图像数据)

对单通道字节图像:

CvScalar s;

s=cvGet2D(img,i,j);//get the(i,j)pixel value

printf("intensity=%f\n",s.val[0]);

s.val[0]=111;

cvSet2D(img,i,j,s);//set the(i,j)pixel value

对多通道浮点或字节图像:

IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3); CvScalar s;

s=cvGet2D(img,i,j);//get the(i,j)pixel value

printf("B=%f,G=%f,R=%f\n",s.val[0],s.val[1],s.val[2]);

s.val[0]=111;

s.val[1]=111;

s.val[2]=111;

cvSet2D(img,i,j,s);//set the(i,j)pixel value

直接存取:(效率高,但容易出错)

对单通道字节图像:

IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); ((uchar*)(img->imageData+i*img->widthStep))[j]=111;

对多通道字节图像:

IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3); ((uchar*)(img->imageData+i*img->widthStep))[j*img->nChannels+ 0]=111;//B

((uchar*)(img->imageData+i*img->widthStep))[j*img->nChannels+ 1]=112;//G

((uchar*)(img->imageData+i*img->widthStep))[j*img->nChannels+ 2]=113;//R

对多通道浮点图像:

((float*)(img->imageData+i*img->widthStep))[j*img->nChannels+

0]=111;//B

((float*)(img->imageData+i*img->widthStep))[j*img->nChannels+

1]=112;//G

((float*)(img->imageData+i*img->widthStep))[j*img->nChannels+

2]=113;//R

用指针直接存取:(在某些情况下简单高效)

对单通道字节图像:

IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); int height=img->height;

int width=img->width;

int step=img->widthStep/sizeof(uchar);

uchar*data=(uchar*)img->imageData;

data[i*step+j]=111;

对多通道字节图像:

IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3); int height=img->height;

int width=img->width;

int step=img->widthStep/sizeof(uchar);

int channels=img->nChannels;

uchar*data=(uchar*)img->imageData;

data[i*step+j*channels+k]=111;

对单通道浮点图像(假设用4字节调整):

IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3); int height=img->height;

int width=img->width;

int step=img->widthStep/sizeof(float);

int channels=img->nChannels;

float*data=(float*)img->imageData;

data[i*step+j*channels+k]=111;

使用c++wrapper进行直接存取:(简单高效)

对单/多通道字节图像,多通道浮点图像定义一个c++wrapper:

templateclass Image

{

private:

IplImage*imgp;

public:

Image(IplImage*img=0){imgp=img;}

~Image(){imgp=0;}

void operator=(IplImage*img){imgp=img;}

inline T*operator[](const int rowIndx){

return((T*)(imgp->imageData+rowIndx*imgp->widthStep));} };

typedef struct{

unsigned char b,g,r;

}RgbPixel;

typedef struct{

float b,g,r;

}RgbPixelFloat;

typedef ImageRgbImage;

typedef ImageRgbImageFloat;

typedef ImageBwImage;

typedef ImageBwImageFloat;

单通道字节图像:

IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); BwImage imgA(img);

imgA[i][j]=111;

多通道字节图像:

IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3); RgbImage imgA(img);

imgA[i][j].b=111;

imgA[i][j].g=111;

imgA[i][j].r=111;

多通道浮点图像:

IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3); RgbImageFloat imgA(img);

imgA[i][j].b=111;

imgA[i][j].g=111;

imgA[i][j].r=111;

图像转换

转为灰度或彩色字节图像:

cvConvertImage(src,dst,flags=0);

src=float/byte grayscale/color image

dst=byte grayscale/color image

flags=CV_CVTIMG_FLIP(flip vertically)

CV_CVTIMG_SWAP_RB(swap the R and B channels)

转换彩色图像为灰度图像:

使用OpenCV转换函数:

cvCvtColor(cimg,gimg,CV_BGR2GRAY);//cimg->gimg

直接转换:

for(i=0;iheight;i++)for(j=0;jwidth;j++)

gimgA[i][j]=(uchar)(cimgA[i][j].b*0.114+

cimgA[i][j].g*0.587

+

cimgA[i][j].r*0.299) ;

颜色空间转换:

cvCvtColor(src,dst,code);//src->dst

code=CV_2

/=RGB,BGR,GRAY,HSV,YCrCb,XYZ,Lab,Luv,HLS

e.g.:CV_BGR2GRAY,CV_BGR2HSV,CV_BGR2Lab

绘图命令

画长方体:

//用宽度为1的红线在(100,100)与(200,200)之间画一长方体

cvRectangle(img,cvPoint(100,100),cvPoint(200,200),cvScalar(255,0,0), 1);

画圆:

//在(100,100)处画一半径为20的圆,使用宽度为1的绿线

cvCircle(img,cvPoint(100,100),20,cvScalar(0,255,0),1);

画线段:

//在(100,100)与(200,200)之间画绿色线段,宽度为1

cvLine(img,cvPoint(100,100),cvPoint(200,200),cvScalar(0,255,0),1);

画一组线段:

CvPoint curve1[]={10,10,10,100,100,100,

100,10};

CvPoint curve2[]={30,30,30,130,130,130,

130,30,150,10};

CvPoint*curveArr[2]={curve1,curve2};

int nCurvePts[2]={4,5};

int nCurves=2;

int isCurveClosed=1;

int lineWidth=1;

cvPolyLine(img,curveArr,nCurvePts,nCurves,isCurveClosed,cvScalar(0,25 5,255),lineWidth);

画内填充色的多边形:

cvFillPoly(img,curveArr,nCurvePts,nCurves,cvScalar(0,255,255));

添加文本:

CvFont font;

double hScale=1.0;

double vScale=1.0;

int lineWidth=1;

cvInitFont(&font,CV_FONT_HERSHEY_SIMPLEX|CV_FONT_ITALIC,

hScale,vScale,0,lineWidth);

cvPutText(img,"My comment",cvPoint(200,400),&font,

cvScalar(255,255,0));

Other possible fonts:

CV_FONT_HERSHEY_SIMPLEX,CV_FONT_HERSHEY_PLAIN,

CV_FONT_HERSHEY_DUPLEX,CV_FONT_HERSHEY_COMPLEX,

CV_FONT_HERSHEY_TRIPLEX,CV_FONT_HERSHEY_COMPLEX_SMALL,

CV_FONT_HERSHEY_SCRIPT_SIMPLEX,CV_FONT_HERSHEY_SCRIPT_COMPLEX,

综述:

OpenCV有针对矩阵操作的C语言函数.许多其他方法提供了更加方便的C++接口,其效率与OpenCV一样.

OpenCV将向量作为1维矩阵处理.

矩阵按行存储,每行有4字节的校整.

分配矩阵空间:

CvMat*cvCreateMat(int rows,int cols,int type);

type:矩阵元素类型.格式为

CV_(S|U|F)C.

例如:CV_8UC1表示8位无符号单通道矩阵,CV_32SC2表示32位有符号双通道矩阵.

例程:

CvMat*M=cvCreateMat(4,4,CV_32FC1);

释放矩阵空间:

CvMat*M=cvCreateMat(4,4,CV_32FC1);

cvReleaseMat(&M);

复制矩阵:

CvMat*M1=cvCreateMat(4,4,CV_32FC1);

CvMat*M2;

M2=cvCloneMat(M1);

初始化矩阵:

double a[]={1,2,3,4,

5,6,7,8,

9,10,11,12};

CvMat Ma=cvMat(3,4,CV_64FC1,a);

另一种方法:

CvMat Ma;

cvInitMatHeader(&Ma,3,4,CV_64FC1,a);

初始化矩阵为单位阵:

CvMat*M=cvCreateMat(4,4,CV_32FC1);

cvSetIdentity(M);//这里似乎有问题,不成功

存取矩阵元素

假设需要存取一个2维浮点矩阵的第(i,j)个元素.

间接存取矩阵元素:

cvmSet(M,i,j,2.0);//Set M(i,j)

t=cvmGet(M,i,j);//Get M(i,j)

直接存取,假设使用4-字节校正:

CvMat*M=cvCreateMat(4,4,CV_32FC1);

int n=M->cols;

float*data=M->data.fl;

data[i*n+j]=3.0;

直接存取,校正字节任意:

CvMat*M=cvCreateMat(4,4,CV_32FC1);

int step=M->step/sizeof(float);

float*data=M->data.fl;

(data+i*step)[j]=3.0;

直接存取一个初始化的矩阵元素:

double a[16];

CvMat Ma=cvMat(3,4,CV_64FC1,a);

a[i*4+j]=2.0;//Ma(i,j)=2.0;

矩阵/向量操作

矩阵-矩阵操作:

CvMat*Ma,*Mb,*Mc;

cvAdd(Ma,Mb,Mc);//Ma+Mb->Mc cvSub(Ma,Mb,Mc);//Ma-Mb->Mc cvMatMul(Ma,Mb,Mc);//Ma*Mb->Mc

按元素的矩阵操作:

CvMat*Ma,*Mb,*Mc;

cvMul(Ma,Mb,Mc);//Ma.*Mb->Mc cvDiv(Ma,Mb,Mc);//Ma./Mb->Mc cvAddS(Ma,cvScalar(-10.0),Mc);//Ma.-10->Mc

向量乘积:

double va[]={1,2,3};

double vb[]={0,0,1};

double vc[3];

CvMat Va=cvMat(3,1,CV_64FC1,va);

CvMat Vb=cvMat(3,1,CV_64FC1,vb);

CvMat Vc=cvMat(3,1,CV_64FC1,vc);

double res=cvDotProduct(&Va,&Vb);//点乘:Va.Vb->res cvCrossProduct(&Va,&Vb,&Vc);//向量积:Va x Vb->Vc

end{verbatim}

注意Va,Vb,Vc在向量积中向量元素个数须相同.

单矩阵操作:

CvMat*Ma,*Mb;

cvTranspose(Ma,Mb);//transpose(Ma)->Mb(不能对自身进行转置)

CvScalar t=cvTrace(Ma);//trace(Ma)->t.val[0]

double d=cvDet(Ma);//det(Ma)->d

cvInvert(Ma,Mb);//inv(Ma)->Mb

非齐次线性系统求解:

CvMat*A=cvCreateMat(3,3,CV_32FC1);

CvMat*x=cvCreateMat(3,1,CV_32FC1);

CvMat*b=cvCreateMat(3,1,CV_32FC1);

cvSolve(&A,&b,&x);//solve(Ax=b)for x

特征值分析(针对对称矩阵):

CvMat*A=cvCreateMat(3,3,CV_32FC1);

CvMat*E=cvCreateMat(3,3,CV_32FC1);

CvMat*l=cvCreateMat(3,1,CV_32FC1);

cvEigenVV(&A,&E,&l);//l=A的特征值(降序排列)

//E=对应的特征向量(每行)

奇异值分解SVD:

CvMat*A=cvCreateMat(3,3,CV_32FC1);

CvMat*U=cvCreateMat(3,3,CV_32FC1);

CvMat*D=cvCreateMat(3,3,CV_32FC1);

CvMat*V=cvCreateMat(3,3,CV_32FC1);

cvSVD(A,D,U,V,CV_SVD_U_T|CV_SVD_V_T);//A=U D V^T 标号使得U和V返回时被转置(若没有转置标号,则有问题不成功!!!).

视频序列操作

从视频序列中抓取一帧

OpenCV支持从摄像头或视频文件(AVI)中抓取图像.

从摄像头获取初始化:

CvCapture*capture=cvCaptureFromCAM(0);//capture from video device #0

从视频文件获取初始化:

CvCapture*capture=cvCaptureFromAVI("infile.avi");

抓取帧:

IplImage*img=0;

if(!cvGrabFrame(capture)){//抓取一帧printf("Could not grab a frame\n\7");

exit(0);

}

img=cvRetrieveFrame(capture);//恢复获取的帧图像

要从多个摄像头同时获取图像,首先从每个摄像头抓取一帧.在抓取动作都结束后再恢复帧图像.

释放抓取源:

cvReleaseCapture(&capture);

注意由设备抓取的图像是由capture函数自动分配和释放的.不要试图自己释放它.

获取/设定帧信息

获取设备特性:

cvQueryFrame(capture);//this call is necessary to get correct

//capture properties int frameH=(int)cvGetCaptureProperty(capture,

CV_CAP_PROP_FRAME_HEIGHT);

int frameW=(int)cvGetCaptureProperty(capture,

CV_CAP_PROP_FRAME_WIDTH);

int fps=(int)cvGetCaptureProperty(capture,

CV_CAP_PROP_FPS);

int numFrames=(int)

cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_COUNT);

所有帧数似乎只与视频文件有关.用摄像头时不对,奇怪!!!.

获取帧信息:

float posMsec=cvGetCaptureProperty(capture, CV_CAP_PROP_POS_MSEC);

int posFrames=(int)cvGetCaptureProperty(capture,

CV_CAP_PROP_POS_FRAMES);

float posRatio=cvGetCaptureProperty(capture, CV_CAP_PROP_POS_AVI_RATIO);

获取所抓取帧在视频序列中的位置,从首帧开始按[毫秒]算.或者从首帧开始从0标号,获取所抓取帧的标号.或者取相对位置,首帧为0,末帧为1,只对视频文件有效.

设定所抓取的第一帧标号:

//从视频文件相对位置0.9处开始抓取

cvSetCaptureProperty(capture,CV_CAP_PROP_POS_AVI_RATIO,(double)0.9);

只对从视频文件抓取有效.不过似乎也不成功!!!

存储视频文件

初始化视频存储器:

CvVideoWriter*writer=0;

int isColor=1;

int fps=25;//or30

int frameW=640;//744for firewire cameras

int frameH=480;//480for firewire cameras

writer=cvCreateVideoWriter("out.avi",CV_FOURCC('P','I','M','1'),

fps,cvSize(f rameW,frameH),isColor);

其他有效编码:

CV_FOURCC('P','I','M','1')=MPEG-1codec

CV_FOURCC('M','J','P','G')=motion-jpeg codec(does not work well)

CV_FOURCC('M','P','4','2')=MPEG-4.2codec

CV_FOURCC('D','I','V','3')=MPEG-4.3codec

CV_FOURCC('D','I','V','X')=MPEG-4codec

CV_FOURCC('U','2','6','3')=H263codec

CV_FOURCC('I','2','6','3')=H263I codec

CV_FOURCC('F','L','V','1')=FLV1codec

若把视频编码设为-1则将打开一个编码选择窗口(windows系统下).

存储视频文件:

IplImage*img=0;

int nFrames=50;

for(i=0;i

cvGrabFrame(capture);//抓取帧

img=cvRetrieveFrame(capture);//恢复图像

cvWriteFrame(writer,img);//将帧添加入视频文件}

若想在抓取中查看抓取图像,可在循环中加入下列代码:

cvShowImage("mainWin",img);

key=cvWaitKey(20);//wait20ms 若没有20[毫秒]延迟,将无法正确显示视频序列.

释放视频存储器:

cvReleaseVideoWriter(&writer);

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.360docs.net/doc/146387094.html,/technology/computing/opencv/?软件下载: https://www.360docs.net/doc/146387094.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的一些基本数据结构和相关函数。

相关主题
相关文档
最新文档