当前位置:文档之家› 快速学习OPENCV常用函数

快速学习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]设有单通道矩阵,有宏CV_MAT_ELEM(matrix,elemtype,row,col),例如对32-bit浮点数的实数矩阵M(i,j)~CV_MAT_ELEM(mat,float,i,j),假如初始化3x3单位阵:CV_MAT_ELEM(mat,float,0,0)=1.f;CV_MAT_ELEM(mat,float,0,1)=0.f;CV_MAT_ELEM(mat,float,0,2)=0.f;CV_MAT_ELEM(mat,float,1,0)=0.f;CV_MAT_ELEM(mat,float,1,1)=1.f;CV_MAT_ELEM(mat,float,1,2)=0.f;CV_MAT_ELEM(mat,float,2,0)=0.f;CV_MAT_ELEM(mat,float,2,1)=0.f;CV_MAT_ELEM(mat,float,2,2)=1.f;3、处理独立的数据如300x20032-bit浮点数image/array,也就是对一个有60000个元素的数组.int cols=300,rows=200;float*myarr=new float[rows*cols];//step1)initializing CvMat headerCvMat mat=cvMat(rows,cols,CV_32FC1,//32-bit floating-point,single channel typemyarr//user data pointer(no data is copied));//step2)using cv functions,e.g.calculating l2(Frobenius)norm double norm=cvNorm(&mat,0,CV_L2);...delete myarr;其它情况在参考手册中有描述.见cvCreateMatHeader,cvInitMatHeader, cvCreateImageHeader,cvSetData etc.---------------------------------------------------------------------4、加载图像,显示/*usage:prog<image_name>*/#include"cv.h"#include"highgui.h"int main(int argc,char**argv){IplImage*img;if(argc==2&&(img=cvLoadImage(argv[1],1))!=0){cvNamedWindow("Image view",1);cvShowImage("Image view",img);cvWaitKey(0);//very important,contains event processing loop inside cvDestroyWindow("Image view");cvReleaseImage(&img);return0;}return-1;}void cvLaplace(IplImage*src,IplImage*dst,int apertureSize=3); void cvSobel(IplImage*src,IplImage*dst,int dx,int dy,int apertureSize=3);void cvCanny(IplImage*img,IplImage*edges,double lowThresh,double highThresh,int apertureSize=3);void cvPreCornerDetect(IplImage*img,IplImage*corners,Int apertureSize);void cvCornerEigenValsAndVecs(IplImage*img,IplImage*eigenvv,int blockSize,int apertureSize=3);void cvCornerMinEigenVal(IplImage*img,IplImage*eigenvv,int blockSize,int apertureSize=3);void cvGoodFeaturesToTrack(IplImage*image,IplImage*eigImage, IplImage*tempImage,CvPoint2D32f*corners,int*cornerCount,double qualityLevel,double minDistance);//对已经粗检测出的角点进行亚像素精准定位void cvFindCornerSubPix(IplImage*img,CvPoint2D32f*corners,int count,CvSize win,CvSize zeroZone,CvTermCriteria criteria);//金字塔分解与重构void cvPyrDown(IplImage*src,IplImage*dst,IplFilterfilter=IPL_GAUSSIAN_5x5);void cvPyrUp(IplImage*src,IplImage*dst,IplFilterfilter=IPL_GAUSSIAN_5x5);void cvThreshold(IplImage*src,IplImage*dst,float thresh,float maxvalue,CvThreshType type);void cvProject3D(CvPoint3D32f*points3D,int count,CvPoint2D32f* points2D,int xindx,int yindx);void cvFindFundamentalMatrix(int*points1,int*points2,int numpoints, int method,CvMatrix3*matrix);//很好用的平滑函数void cvSmooth(const CvArr*src,CvArr*dst,intsmoothtype=CV_GAUSSIAN,int param1=3,int param2=0,double param3=0); CV_BLUR_NO_SCALE CV_BLUR CV_GAUSSIAN CV_MEDIAN CV_BILATERAL其他辅助函数:void cvPutText(CvArr*img,const char*text,CvPoint org,const CvFont* font,CvScalar color);cvCvtColor(image,gray,CV_BGR2GRAY);//彩色图像灰度化cvCvtPlaneToPix(planes[0],planes[1],planes[2],0,currentimage); cvSplit(colorimage,plane[0],plane[1],plane[2],0);。

相关主题