怎么访问图像元素
(坐标起点相对于图像原点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);
相关推荐
opencv图像处理中常用函数汇总,包括显示图像,保存图像,图像灰度化,边缘检测等函数使用方式
OPENCV图像处理的函数说明
opencv图像处理 OpenCV是一个开源的计算机视觉库,提供了很多图像处理、计算机视觉和机器学习等方面的函数和工具,被广泛应用于各种计算机视觉领域的研究和应用中。本文将介绍如何使用OpenCV进行图像处理,包括图像...
图像处理和图像识别中常用的OpenCV函数,推荐一下。
图像处理和图像识别中常用的OpenCV函数说明 图像处理和图像识别中常用的OpenCV函数说明 图像处理和图像识别中常用的OpenCV函数说明
219个图像处理和图像识别中常用的OpenCV函数(中文注释)
图像处理和识别中常用的OpenCV函数 图像处理时经常使用的一些函数!
OpenCV 学习利器,包含几乎所有的OpenCV库函数及数据,在编写程序时很方便查询。
图像处理和图像识别中常用的OpenCV函数,很好用,对opencv初学者有帮助
可以打开图像、视频,并作简单的数字图象处理,视频目标检测、跟踪等等,包含大量的基础算法,基于opencv1.0和vc6.0(vs2008)都可以应用,不用安装,直接编译运行就可以,对于初学者熟悉opencv的常用函数很有帮助。...
OPENCV函数手册,OPENCV常用函数速查,详细使用例子等。
include "cv.h" #include "highgui.h" #include #include int main( int argc, char** argv ) {
包含图像处理和识别中常用的OpenCV函数
图像处理opencv函数库,内含一些常用的函数以及其功能作用。
Opencv的版本是1.0的,在VC++6.0下基于MFC框架的代码程序,里面基本上包含了Opencv图像处理的常用函数的应用,适合初学者。