`
yingyingol
  • 浏览: 742776 次
文章分类
社区版块
存档分类
最新评论

OpenCV 图像处理常用函数

 
阅读更多

怎么访问图像元素
(坐标起点相对于图像原点imageorigin从0开始,或者是左上角(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,那么可以:
CvPointpt={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;

或者更有效的
CvPointpt={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)

也有针对各种图像(包括4-通道)和矩阵的函数(cvGet2D,cvSet2D),但是它们都很慢.
--------------------------------------------------------------------------------

如何访问矩阵元素?
方法是类似的(都是针对0起点的列和行)

设有32-bit浮点数的实数矩阵M(CvMat*mat):
M(i,j)~((float*)(mat->data.ptr+mat->step*i))[j]

设有64-bit浮点数的复数矩阵M(CvMat*mat):
ReM(i,j)~((double*)(mat->data.ptr+mat->step*i))[j*2]
ImM(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;


--------------------------------------------------------------------------------

如何在OpenCV中处理我自己的数据
设你有300x20032-bit浮点数image/array,也就是对一个有60000个元素的数组.

intcols=300,rows=200;
float*myarr=newfloat[rows*cols];

//step1)initializingCvMatheader
CvMatmat=cvMat(rows,cols,
CV_32FC1,//32-bitfloating-point,singlechanneltype
myarr//userdatapointer(nodataiscopied)
);
//step2)usingcvfunctions,e.g.calculatingl2(Frobenius)norm
doublenorm=cvNorm(&mat,0,CV_L2);

...
deletemyarr;

其它情况在参考手册中有描述.见cvCreateMatHeader,cvInitMatHeader,cvCreateImageHeader,cvSetDataetc.
--------------------------------------------------------------------------------

如何加载和显示图像
/*usage:prog<image_name>*/
#include"cv.h"
#include"highgui.h"

intmain(intargc,char**argv)
{
IplImage*img;
if(argc==2&&(img=cvLoadImage(argv[1],1))!=0)
{
cvNamedWindow("Imageview",1);
cvShowImage("Imageview",img);
cvWaitKey(0);//veryimportant,containseventprocessingloopinside
cvDestroyWindow("Imageview");
cvReleaseImage(&img);
return0;
}
return-1;
}

voidcvLaplace(IplImage*src,IplImage*dst,intapertureSize=3);
voidcvSobel(IplImage*src,IplImage*dst,intdx,intdy,intapertureSize=3);
voidcvCanny(IplImage*img,IplImage*edges,doublelowThresh,doublehighThresh,intapertureSize=3);

voidcvPreCornerDetect(IplImage*img,IplImage*corners,IntapertureSize);
voidcvCornerEigenValsAndVecs(IplImage*img,IplImage*eigenvv,intblockSize,intapertureSize=3);
voidcvCornerMinEigenVal(IplImage*img,IplImage*eigenvv,intblockSize,intapertureSize=3);
voidcvGoodFeaturesToTrack(IplImage*image,IplImage*eigImage,IplImage*tempImage,CvPoint2D32f*corners,int*cornerCount,doublequalityLevel,doubleminDistance);
//对已经粗检测出的角点进行亚像素精准定位
voidcvFindCornerSubPix(IplImage*img,CvPoint2D32f*corners,intcount,CvSizewin,CvSizezeroZone,CvTermCriteriacriteria);

//金字塔分解与重构
voidcvPyrDown(IplImage*src,IplImage*dst,IplFilterfilter=IPL_GAUSSIAN_5x5);
voidcvPyrUp(IplImage*src,IplImage*dst,IplFilterfilter=IPL_GAUSSIAN_5x5);

voidcvThreshold(IplImage*src,IplImage*dst,floatthresh,floatmaxvalue,CvThreshTypetype);

voidcvProject3D(CvPoint3D32f*points3D,intcount,CvPoint2D32f*points2D,intxindx,intyindx);

voidcvFindFundamentalMatrix(int*points1,int*points2,intnumpoints,intmethod,CvMatrix3*matrix);

//很好用的平滑函数
voidcvSmooth(constCvArr*src,CvArr*dst,intsmoothtype=CV_GAUSSIAN,intparam1=3,intparam2=0,doubleparam3=0);
CV_BLUR_NO_SCALECV_BLURCV_GAUSSIANCV_MEDIANCV_BILATERAL

其他辅助函数:
voidcvPutText(CvArr*img,constchar*text,CvPointorg,constCvFont*font,CvScalarcolor);

cvCvtColor(image,gray,CV_BGR2GRAY);//彩色图像灰度化

cvCvtPlaneToPix(planes[0],planes[1],planes[2],0,currentimage);
cvSplit(colorimage,plane[0],plane[1],plane[2],0);

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics