本文主要自OpenCVChina,转载请注明出处http://blog.sina.com.cn/lucyloveayu
OpenCV是一个基于C/C++语言的开源图像处理函数库,其特点有:
1.
2.
3.
4.
5.
【OpenCV功能】
1.
2.
3.
奇异值分解);
4.
5.
6.
7.
8.
9.
10.
11.
【OpenCV基本模块】
cv——核心函数库
cvaux——辅助函数库
cxcore——数据结构与线性代数库
highgui——GUI函数库
ml——机器学习函数库
【OpenCV命名规则】
A.
cvActionTargetMod(…)
Action=核心功能(core functionality)(eg:set,create)
Target=目标图像区域(target image area) (eg:contour,polygon)
Mod=(可选的)调整语(optional modifiers)(eg:argument type)
B.
CV_(S|U|F)
S=符号整形
U=无符号整形
F=浮点型
(eg:CV_8UC1是指一个8位无符号整形单通道矩阵,
C.
IPL_DEPTH(S|U|F)
Eg:
IPL_DEPTH_8U图像像素数据是8位无符号整形。
IPL_DEPTH_32P图像像素数据是32位浮点型。
【头文件包含】
#include——核心函数库
#include——辅助函数库
#include——机器学习库
#include——GUI函数库
#include//一般不需要,因为cv.h已经包含该头文件 数据结构与线性代数库
【OpenCV中的基本数据结构】
1.
A.
IPLImage | |
Int | 颜色通道的数目(1,2,3,4) |
Int | 像素的位深 IPL_DEPTH_8U IPL_DEPTH_16S IPL_DEPTH_32F IPL_DEPTH_64F |
Int width | 图像宽度(像素为单位) |
Int height | 图像高度 |
Char * imageData | 图像数据指针 彩色图像按照BGR的顺序存储数据 |
Int dataOrder | 0——将像素点不同的通道的值交错排在一起,形成单一的像素平面 1——把所有的像素同通道值排在一起,形成若干个通道平面,再把平面排列起来 |
Int origin | 0 –像素原点=左上角 1 –像素原点为左下角(windows bitmaps Style) |
Int widthStep | 相邻行的同列点之间的字节数 |
Int imageSize | 图像的大小(字节为单位)=height*widthStep |
Struct _IplROI *roi | 图像的感兴区域(ROI),ROI非空的会后对图像的处理仅限于ROI区域 |
Char *imageDataOrigin | 图像数据未对齐时候的数据原点指针 (需要正确地重新分配图像内存) |
Int align | 图像数据的行对齐 :4 or 8 byte alignment |
Char colorModel[4] | 颜色模型(OpenCV中没有此项) |
2.
A.2D矩阵
CvMat(2D矩阵) | ||
int | 元素类型 | |
int | 整行长度字节数 | |
Int | 行、列数 | |
int height,width | 矩阵高度、宽度、与rows,cols对应 | |
Union data | | |
| Uchar *ptr | 指向unsigned char矩阵的指针 |
| Short *s | 指向short矩阵的指针 |
| Int * i | 指向整形矩阵的指针 |
| Float *fl | 指向浮点型矩阵的指针 |
| Double *db | 指向双精度浮点型矩阵的指针 |
B. N维矩阵
CvMatND(N-维矩阵) | |
Int | 元素类型(uchar,short,int,float,double) |
Int dims | 矩阵维数 |
Union | Uchar *Ptr Short *s Int Float Double *db |
Struct dim[] | 各维信息 |
| Size 元素数目 Step 元素间距 字节为单位 |
C. CvSparseMat //N-维稀疏矩阵
D.一般矩阵
E.标量
CvScalar
初始化:
CvScalar
CvScalar
s.val[0]=20.0
3.
CvPoint
CvPoint 2D32f p=cvPoint2d32f(float x,float y);//浮点型二维点
Cvpoint3D32f p=cvPoint3D32f(float x,float y,float z);//浮点型三维点
4.
cvSize= cvSize(int width,int height)
CvSize2D32f
5.
CvRect
【OpenCV的图像读写】
1.
OpenCV默认将读入的图像强制转换为一副三通道彩色图像:
IplImage *
Img=cvLoadImage(fileName);
If(!img) printf(“could
OpenCV支持图像格式有:BMP、DIB、JPEG、JPE、PNG、PBM、PGM、PPM、SR、RAS、TIFF、TIF
可以按照如下的方式修改读入的方式:
flag:
2.
If(!cvSaveImage(outFileName,img)) printf(“could not save :%s\n”,outFileName)
保存的图像的格式由outFileName中的扩展名确定
【OpenCV访问图像像素】
1.
IplImage
CvScalar
S=cvGet2D(img,i,j);//注意本函数中坐标参数的顺序与其它的openCV函数坐标参数顺序恰好相反,本函数中的i代表height,而j代表width
Printf(“intensity=%f\n”,s.val[0]);
s.val[0]=111;
cvSet2D(img,I,j,s); //设置img(J,i)位置的像素值为s
2.
单通道字节型图像:
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_32F,3);
((uchar*) (img->imageData+i*img->widthStep))[j*img->nChannels+0]=111;
((ucahr *)(img->imageData+i*img->widthStep))[j*img->nChannels+1]=112;
((uchar *)(img->imageData+i*img->widthStep))[j*img->nChannels+2]=113;
多通道浮点型图像:
IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);
((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
3.
单通道字节型图像:
IplImage *img=cvCreateImage(cvSIze(640,480),IPL_DEPTH_8U,1)
Int height
Int width
Int Step
Uchar *data
Data[i*setp+j]=111;
4.
首先定义一个C++
Template class Image
{
Private:
};
Typedef
Typedef
}RgbPixelFloat;
typedef
typedef
typedef
typedef
对于单通道字节型图像:
IplImage
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;
【图像转换】
1)
cvConcertImage(src,dst,flags=0)
src=float/byte
dst=byte grayscale/color imae
flags=CV_CVTIMG_FLIP
2)
cvCvtColor(cimg,gimg,CV_BGR2GRAY)
//使用直接转换
for(i=0;iheight;i++)
for(j=0;jwidth;j++)
3)
cvCvColor(src,dst,code)
code=CV_2
/=RGB,BGR,GRAY,HSV,YCrCb,XYZ,Lab,Luv,HLS