OpenCV是一个C/C++编写的,开源的计算机视觉库;OpenCV也提供了Python,Ruby,MATLAB的接口。OpenCV主要关注实时应用,所以,执行速度快是他的一个主要的设计目标。
OpenCV还提供了MML(Machine Learning Library)机器学习库,该机器学习库侧重于统计方面的模式识别和聚类(clustering)。处理在计算机视觉领域,还可以轻松的应用在其他的机器学习场合。
OpenCV主要包括五个模块:CV(图像处理和视觉算法),MLL(统计分类器),HighGUI(GUI, 图像和视频输入/输出),CXCORE(基本结构和算法,XML支持,绘图函数),CvAux(存放一些即将被淘汰的算法和函数,以及一些新出现的实验性的算法和函数)。
其结构图如下:
OpenCV中矩阵和图像的类型如下图:
其结构虽然是C语言编写,但是采用了C++继承的思想,采用了类似于上图显示的继承关系。
CvMat的结构如下代码:
typedef struct CvMat
{
int type;
int step;
/* for internal use only */
int* refcount;
int hdr_refcount;
union
{
uchar* ptr;
short* s;
int* i;
float* fl;
double* db;
} data;
#ifdef __cplusplus
union
{
int rows;
int height;
};
union
{
int cols;
int width;
};
#else
int rows;
int cols;
#endif
#ifdef __cplusplus
CvMat() {}
CvMat(const CvMat& m) { memcpy(this, &m, sizeof(CvMat));}
CvMat(const cv::Mat& m);
#endif
}
CvMat;
IplImage的结构如下代码:
typedef struct _IplImage
{
int nSize; /**< sizeof(IplImage) */
int ID; /**< version (=0)*/
int nChannels; /**< Most of OpenCV functions support 1,2,3 or 4 channels */
int alphaChannel; /**< Ignored by OpenCV */
int depth; /**< Pixel depth in bits: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16S,
IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_DEPTH_64F are supported. */
char colorModel[4]; /**< Ignored by OpenCV */
char channelSeq[4]; /**< ditto */
int dataOrder; /**< 0 - interleaved color channels, 1 - separate color channels.
cvCreateImage can only create interleaved images */
int origin; /**< 0 - top-left origin,
1 - bottom-left origin (Windows bitmaps style). */
int align; /**< Alignment of image rows (4 or 8).
OpenCV ignores it and uses widthStep instead. */
int width; /**< Image width in pixels. */
int height; /**< Image height in pixels. */
struct _IplROI *roi; /**< Image ROI. If NULL, the whole image is selected. */
struct _IplImage *maskROI; /**< Must be NULL. */
void *imageId; /**< " " */
struct _IplTileInfo *tileInfo; /**< " " */
int imageSize; /**< Image data size in bytes
(==image->height*image->widthStep
in case of interleaved data)*/
char *imageData; /**< Pointer to aligned image data. */
int widthStep; /**< Size of aligned image row in bytes. */
int BorderMode[4]; /**< Ignored by OpenCV. */
int BorderConst[4]; /**< Ditto. */
char *imageDataOrigin; /**< Pointer to very origin of image data
(not necessarily aligned) -
needed for correct deallocation */
#ifdef __cplusplus
_IplImage() {}
_IplImage(const cv::Mat& m);
#endif
}
IplImage;
在OpenCV中表示图像主要采用IplImage结构,在上述结构中,需要注意如下字段:
depth | 取值范围如下: IPL_DEPTH_8U IPL_DEPTH_8S IPL_DEPTH_16S IPL_DEPTH_32S IPL_DEPTH_32F IPL_DEPTH_64F |
origin | 坐标源点的位置于图像的左上角(IPL_ORIGIN_TL)或者左下角(IPL_ORIGIN_BL) |
dataOrder | 将像素点不同通道的值交错在一起(IPL_DATA_ORDER_PIXEL)或者把所有像素同通道值排列在一起(IPL_DATA_ORDER_PLANE) |
widthStep | 和CvMat中的step类似,表示一列数据的字节数 |
imageData | 指向第一行图像数据点指针 |
roi | 感兴趣区域。IplROI包括xoffset, yoffset, height, width和coi,ROI的思想是,一旦设定了ROI,那么通常对于一个图像进行操作,就是对于ROI进行操作。 使用cvSetImageROI()和cvReleaseROI进行设置和取消ROI。 |
矩阵和图像的常用操作如下:
cvAbs | 计算数组中所有元素的绝对值 |
cvAbsDiff | 计算两个数组差值的绝对值 |
cvAbsDiffS | 计算数组和标量差值的绝对值 |
cvAdd | 两个数组的元素级的加运算 |
cvAddS | 一个数组和一个标量的元素基的相加运算 |
cvAddWeighted | 两个数组的元素级的加权相加运算(alpha融合) |
cvAvg | 计算数组中所有元素的平均值 |
cvAvgSdv | 计算数组中所有元素的绝对值和标准差 |
cvCalcCovarMatrix | 计算一组n维空间向量的协方差 |
cvCmp | 对两个数组中的所有元素运用设置的比较操作 |
cvCmpS | 对数组和标量运用设置的比较操作 |
cvConvertScale | 用可选的缩放值转换数组元素类型 |
cvConvertScaleAbs | 计算可选的缩放值的绝对值之后再转换数组元素的类型 |
cvCopy | 把数组中的值复制到另外一个数组中 |
cvCountNoneZero | 计算数组中非0值的个数 |
cvCrossProduct | 计算两个三维向量的向量积(叉积) |
cvCvtColor | 将数组的通道从一个颜色空间转换到另外一个颜色空间 |
cvDet | 计算方阵的行列式 |
cvDiv | 用另外一个数组对一个数组进行元素级的除法运算 |
cvDotProduct | 计算两个向量的点积 |
cvEignVV | 计算方阵的特征值和特征向量 |
cvFlip | 围绕选定的轴翻转 |
cvGEMM | 矩阵乘法 |
cvGetCol | 从一个数组的列中复制元素 |
cvGetCols | 从数组的向量的多列中复制元素 |
cvGetDiag | 复制数组中的对角线上的所有元素 |
cvGetDims | 返回数组的维数 |
cvGetDimSize | 返回一个数组的所有维的大小 |
cvGetRow | 从一个数组的行中复制元素 |
cvGetRows | 从一个数组的多个相邻的行中复制元素 |
cvGetSize | 得到二维数组的尺寸,以CvSize返回 |
cvGetSubRect | 从一个数组的子区域复制元素值 |
cvInRange | 检查一个数组的元素是否在另外两个数组的取值范围内 |
cvInRangeS | 检查一个数组的元素的值是否在两外两个标量的范围 |
cvInvert | 求矩阵的转置 |
cvMahalonobis | 计算两个向量的马氏距离 |
cvMax | 在两个数组中进行元素级的取最大操作 |
cvMaxS | 在一个数组和一个标量中进行元素级的最大值操作 |
cvMerge | 把几个单通道图像合并为一个多通道的图像 |
cvMin | 在两个数组中进行元素级的取最小值操作 |
cvMinS | 在一个数组和一个标量中进行元素级的最小值操作 |
cvMinMaxLoc | 寻找数组中的最大值和最小值 |
cvMul | 计算两个数组的元素级的乘积 |
cvNot | 按位对数组中每一个元素求反 |
cvNorm | 计算两个数组的正态相关性 |
cvNormalize | 将数组中的元素归一化 |
cvOr | 对两个数组进行按位或操作 |
cvOrS | 对数组与标量之间进行按位或操作 |
cvReduce | 通过给定的操作符将二维数组约简为向量 |
cvRepeat | 以平铺的方式进行数组的复制 |
cvSet | 用给定值初始化数组 |
cvSetZero | 将数组中所有的元素初始化为0 |
cvSetIdentity | 将数组中对角线上的元素设置为1,其他设置为0 |
cvSlove | 解出线性方程的解 |
cvSplit | 将多通道数组分割成多个单通道数组 |
cvSub | 两个数组元素级相减 |
cvSubS | 元素级的从数组中减去标量 |
cvSubRS | 元素级从标量减去数组 |
cvSum | 对数组中的所有元素求和 |
cvSVD | 二维数组的奇异值分解 |
cvSVBksb | 奇异值回代计算 |
cvTrace | 计算矩阵迹 |
cvTranspose | 矩阵的转置运算 |
cvXor | 对两个数组进行按位异或操作 |
cvXorS | 在数组和标量之间进行按位异或操作 |
cvZero | 将所有数组的元素设置为0 |
直线:cvLine
矩形:cvRectangle
圆形和椭圆:cvCircle, cvEllipse, cvEllipseBox
多边形:cvFillPoly, cvFillConvexPoly, cvPolyLine
文字:cvPutText
cvPutText的第三个参数是CvFont,我们可以用
void cvInitFont( CvFont *font, int font_face, double hscale, double vscale, double shear, int thickness, int line_type )
对字体进行初始化,font_face可以取值如下:
enum HersheyFonts {
FONT_HERSHEY_SIMPLEX = 0, //!< normal size sans-serif font
FONT_HERSHEY_PLAIN = 1, //!< small size sans-serif font
FONT_HERSHEY_DUPLEX = 2, //!< normal size sans-serif font (more complex than FONT_HERSHEY_SIMPLEX)
FONT_HERSHEY_COMPLEX = 3, //!< normal size serif font
FONT_HERSHEY_TRIPLEX = 4, //!< normal size serif font (more complex than FONT_HERSHEY_COMPLEX)
FONT_HERSHEY_COMPLEX_SMALL = 5, //!< smaller version of FONT_HERSHEY_COMPLEX
FONT_HERSHEY_SCRIPT_SIMPLEX = 6, //!< hand-writing style font
FONT_HERSHEY_SCRIPT_COMPLEX = 7, //!< more complex variant of FONT_HERSHEY_SCRIPT_SIMPLEX
FONT_ITALIC = 16 //!< flag for italic font
};