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

本文介绍了OpenCV的基本概念、模块组成及图像处理方法。OpenCV是一个开源的计算机视觉库,支持多种编程语言。文章详细解析了核心数据结构CvMat和IplImage,并列举了一系列常用的图像处理函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值