码迷,mamicode.com
首页 > 其他好文 > 详细

[OpenCV] IplImage and Functions

时间:2016-07-08 19:39:21      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:

In this chapter, APIs will make U crazy. Good luck! 

 

 "modules/core/include/opencv2/core/types_c.h"

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  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 */
}
IplImage;

 


 局部区域操作

#include <highgui.h>

int main(void) { IplImage* src; cvNamedWindow("Example3_12_pre", CV_WINDOW_AUTOSIZE); cvNamedWindow("Example3_12_post", CV_WINDOW_AUTOSIZE); if(((src=cvLoadImage("/home/unsw/lolo.jpg",1)) != 0 )) { int x = atoi("10"); int y = atoi("20"); int width = atoi("50"); int height = atoi("100"); int add = atoi("100"); cvShowImage( "Example3_12_pre", src);
cvSetImageROI(src, cvRect(x,y,width,height));  //设置专注范围 cvAddS(src, cvScalar(add,
0, 0, 0), src, NULL); //只在专注的范围执行函数 cvResetImageROI(src);  //如果注销,下一个函数(显示图像)则只会显示指定区域
cvShowImage(
"Example3_12_post",src); cvWaitKey(5000); } cvReleaseImage( &src ); cvDestroyWindow("Example3_12_pre"); cvDestroyWindow("Example3_12_post"); return 0; }

 但以下方式更加灵活,方便实现多区域同时处理。

int main(int argc, char** argv)
{
    IplImage* interest_img;
    CvRect interest_rect;
    if( argc == 7 && ((interest_img=cvLoadImage(argv[1],1)) != 0 ))
    {
        interest_rect.x = atoi(argv[2]);
        interest_rect.y = atoi(argv[3]);
        interest_rect.width = atoi(argv[4]);
        interest_rect.height = atoi(argv[5]);
        int add = atoi(argv[6]);

        // Assuming IplImage *interest_img; and 
        //  CvRect interest_rect;
        //  Use widthStep to get a region of interest
        //
        // (Alternate method)
        //
        IplImage *sub_img = cvCreateImageHeader(
          cvSize(
             interest_rect.width, 
             interest_rect.height
          ),
          interest_img->depth, 
          interest_img->nChannels
        );
        
        sub_img->origin = interest_img->origin;
        
        sub_img->widthStep = interest_img->widthStep;
        
        sub_img->imageData = interest_img->imageData + 
          interest_rect.y * interest_img->widthStep  +
          interest_rect.x * interest_img->nChannels;
        
        cvAddS( sub_img, cvScalar(add), sub_img );
        
        cvReleaseImageHeader(&sub_img);

        cvNamedWindow( "Roi_Add", CV_WINDOW_AUTOSIZE );
        cvShowImage( "Roi_Add", interest_img );
        cvWaitKey();
    }
    return 0;
}

  


 一些操作矩阵图像的函数 

cvAbs 计算数组中所有元素的绝对值  
cvAbsDiff 计算两个数组差值的绝对值  
cvAbsDiffs 计算数组和标量差值的绝对值  
cvAdd 两个数组的元素级的加运算  
cvAdds 一个数组和一个标量的元素级的相加运算  
cvAddWeighted 两个数组的元素的加权相加运算(alpha融合) 01
cvAvg 计算数组所有元素的平均值  
cvAvgSdv 计算数组中所有元素的绝对值和标准差  
cvCalcCovarMatrix 计算一组n维空间向量的协方差  
cvCmp 对两个数组中的所有元素运用设置的比较操作  
cvCmps 对数组和标量运用设置的比较  
cvConvertScale 用可选的缩放值转换数组元素类型  
cvConvertScaleAbs 计算可选的缩放值的绝对值之后在转换数组元素的类型  
cvCopy 把数组中的值复制到另一个数组中  
cvCountNonZero 计算数组中非0值的个数  
cvCrossProduct 计算两个三维向量的向量积(叉积)  
cvCvtColor 将数组通道从一个颜色空间转换到另外一个颜色空间  
cvDet 计算方阵的行列式  
cvDiv 用另外一个数组对一个数组进行元素级的除法运算  
cvDotProduct 计算两个向量的点积  
cvEigenVV 计算方阵的特征值和特征向量  
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  
cvSolve 求出线性方程的解  
cvSplit 将多通道数组分割成但通道数组  
cvSub 两个数组元素级的相减  
cvSubS 元素级的从数组减去标量  
cvSubRS 元素级的从标量减去数组  
cvSum 对数组中的所有元素求和  
cvSVD 二维矩阵的奇异值分解  
cvSVBkSb 奇异值回代计算  
cvTrace 计算矩阵迹  
cvTranspose 矩阵的转置运算  
cvXor 对两个数组进行按位异或运算  
cvXorS 在数组和标量之间进行安慰异或操作  
cvZero 将所有数组中的元素置为0  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

待续 。。。 


 01. 两张图像融合

#include <highgui.h>
#include <stdio.h>

// alphablend <imageA> <image B> <x> <y> <width> <height>
//            <alpha> <beta>

int main(void)
{
    char *argvv[10];
    argvv[1] = "/home/unsw/lolo.jpg";
    argvv[2] = "/home/unsw/lolo2.jpg";
    argvv[3] = "0";
    argvv[4] = "0";
    argvv[5] = "500";
    argvv[6] = "1000";
    argvv[7] = "0";
    argvv[8] = "0.1";

    IplImage *src1, *src2;
    if( ((src1=cvLoadImage(argvv[1],1)) != 0) &&
            ((src2=cvLoadImage(argvv[2],1)) != 0 ))
    {
        int x = atoi(argvv[3]);
        int y = atoi(argvv[4]);
        int width = atoi(argvv[5]);
        int height = atoi(argvv[6]);
        double alpha = (double)atof(argvv[7]);
        double beta  = (double)atof(argvv[8]);

        cvSetImageROI(src1, cvRect(x,y,width,height));
        cvSetImageROI(src2, cvRect(0,0,width,height));
        //mix
        cvAddWeighted(src1, alpha, src2, beta, 0.0, src1);

        cvResetImageROI(src1);
        cvNamedWindow( "Alpha_blend", 1 );
        cvShowImage( "Alpha_blend", src1 );
        cvWaitKey(5000);
    }
    else
        printf("Couldn‘t load one or both of %s, %s\n",argvv[1],argvv[2]);
    return 0;
}

 

 


 

 

 

 

 

 

 

 

[OpenCV] IplImage and Functions

标签:

原文地址:http://www.cnblogs.com/jesse123/p/5654213.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!