学习OPENCV笔记(1):第三章 初探OPENCV

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(存放一些即将被淘汰的算法和函数,以及一些新出现的实验性的算法和函数)。

其结构图如下:

学习OPENCV笔记(1):第三章 初探OPENCV_第1张图片

 

3 矩阵和图像的类型

OpenCV中矩阵和图像的类型如下图:

学习OPENCV笔记(1):第三章 初探OPENCV_第2张图片

其结构虽然是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
};

 

你可能感兴趣的:(图像)