OpenCV中文入门
- 格式:doc
- 大小:24.00 KB
- 文档页数:5
百度文库 - 让每个人平等地提升自我
1 书籍:
Open Source Computer Vision Library by Gary R. Bradski, Vadim Pisarevsky, and Jean-Yves
Bouguet, Springer, 1st ed. (June, 2006).
视频处理例程 (位于 /samples/c/目录中):
色彩跟踪: camshiftdemo
点跟踪: lkdemo
动作分割: motempl
边缘检测: laplace
图像处理例程(位于/samples/c/目录中):
边缘检测: edge
分割: pyramid_segmentation
形态: morphology
直方图: demhist
距离转换: distrans
椭圆拟合 fitellipse
OpenCV 命名约定
函数命名:
cvActionTarget[Mod](...)
Action = 核心功能(例如 设定set, 创建create)
Target = 操作目标 (例如 轮廓contour, 多边形polygon)
[Mod] = 可选修饰词 (例如说明参数类型)
矩阵数据类型:
CV_(S|U|F)C
S = 带符号整数
U = 无符号整数
F = 浮点数
例: CV_8UC1 表示一个8位无符号单通道矩阵,
CV_32FC2 表示一个32位浮点双通道矩阵.
图像数据类型:
IPL_DEPTH_(S|U|F)
例: IPL_DEPTH_8U 表示一个8位无符号图像.
IPL_DEPTH_32F 表示一个32位浮点数图像.
头文件:
#include <>
#include <>
#include <>
#include <> C程序实例
关闭窗口:
cvDestroyWindow("win1");
改变窗口尺寸:
cvResizeWindow("win1",100,100);
直接获取键盘操作: 百度文库 - 让每个人平等地提升自我
2 int key;
key=cvWaitKey(10); .
break;
case 'i':
...
break;
}
}
处理滚动条事件:
定义滚动条handler:
void trackbarHandler(int pos)
{
printf("Trackbar ",pos);
}
注册handler:
int trackbarVal=25;
int maxVal=100;
cvCreateTrackbar("bar1", "win1", &trackbarVal ,maxVal , trackbarHandler);
获取滚动条当前位置:
int pos = cvGetTrackbarPos("bar1","win1");
设定滚动条位置:
cvSetTrackbarPos("bar1", "win1", 25);
OpenCV基础数据结构
图像数据结构
IPL 图像:
IplImage
|-- int nChannels; 若不为NULL则表示需要处理的图像
| |-- char *imageDataOrigin;
它不是C++的构造函数.
其他数据结构
点:
CvPoint p = cvPoint(int x, int y);
CvPoint2D32f p = cvPoint2D32f(float x, float y);
CvPoint3D32f p = cvPoint3D32f(float x, float y, float z);
例如:
=;
=;
长方形尺寸:
CvSize r = cvSize(int width, int height);
CvSize2D32f r = cvSize2D32f(float width, float height);
带偏移量的长方形尺寸:
CvRect r = cvRect(int x, int y, int width, int height);
图像处理
分配与释放图像空间 百度文库 - 让每个人平等地提升自我
3 分配图像空间:
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, 3 or 4.
注意数据为交叉存取.彩色图像的数据编排为b0 g0 r0 b1 g1 r1 ...
举例:
设定/获取兴趣通道:
void cvSetImageCOI(IplImage* image, int 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].
间接存取: (比较通用, 但效率低, 可读取任一类型图像数据)
对单通道字节图像:
IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);
CvScalar s;
s=cvGet2D(img,i,j); = 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 百度文库 - 让每个人平等地提升自我
4 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); * +
cimgA[i][j].g* +
cimgA[i][j].r*;
颜色空间转换:
cvCvtColor(src,dst,code); CV_BGR2GRAY, CV_BGR2HSV, CV_BGR2Lab
绘图命令
画长方体:
许多其他方法提供了更加方便的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);
间接存取矩阵元素:
cvmSet(M,i,j,; Mb -> Mc
cvDiv(Ma, Mb, Mc); Mb -> Mc
cvAddS(Ma, cvScalar, Mc); Vb -> res
cvCrossProduct(&Va, &Vb, &Vc);