1 什么是OPENCV
OpenCV是一个C/C++编写的,开源的计算机视觉库;OpenCV也提供了Python,Ruby,MATLAB的接口。OpenCV主要关注实时应用,所以,执行速度快是他的一个主要的设计目标。
OpenCV还提供了MML(Machine Learning Library)机器学习库,该机器学习库侧重于统计方面的模式识别和聚类(clustering)。处理在计算机视觉领域,还可以轻松的应用在其他的机器学习场合。
2 OpenCV的结构和内容
OpenCV主要包括五个模块:CV(图像处理和视觉算法),MLL(统计分类器),HighGUI(GUI, 图像和视频输入/输出),CXCORE(基本结构和算法,XML支持,绘图函数),CvAux(存放一些即将被淘汰的算法和函数,以及一些新出现的实验性的算法和函数)。
其结构图如下:

3 矩阵和图像的类型
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 |
4 绘图
直线: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
};
本文介绍了OpenCV的基本概念、模块组成及图像处理方法。OpenCV是一个开源的计算机视觉库,支持多种编程语言。文章详细解析了核心数据结构CvMat和IplImage,并列举了一系列常用的图像处理函数。
663

被折叠的 条评论
为什么被折叠?



