opencv 入门初步

一、Opencv 简单入门

1、加载图片

#include "highgui.h"

int main(int argc, char** argv) {
    IplImage* img = cvLoadImage( argv[1] );
    cvNamedWindow( "Example1", CV_WINDOW_AUTOSIZE );
    cvShowImage( "Exmaple1", img );
    cvWaitKey(0);
    cvReleaseImage( &img) ;
    cvDestroyWindwo("Example1");
}


2、播放AVI视频

#include "hgihgui.h"

int main(int argc, char** argv) {
    cvNamedWindow( "Example2", CV_WINDOW_AUTOSIZE );
    CvCapture* capture = cvCreateFileCaptrue( argv[1] );
    IplImage* frame;
    while(1) {
        frame = cvQureyFrame( capture);
        if (!frame ) break;
        
        cvShowImage( "Exmaple2", frame );
        char c = cvWaitKey(33);
        if ( c == 27) break;
    }
    
    cvReleaseCapture( &capture) ;
    cvDestroyWindwo("Example2");
}


3、从摄像机读入数据

CvCapture* capture;

if (argc==1) {
    capture = cvCreateCameraCapture(0);
} else {
    capture = cvCreateFileCapture(argv[1]);
}
assert( capture != NULL);


4、写入AVI 视频文件

## cvCreateVideoWriter()   // 创建捕获设备
## cvWriterFrame()         // 将视频流写入文件
## cvReleaseVideoWriter()  // 释放资源

#include "cv.h"
#include "highgui.h"

main(int argc, char* argv[]) {

    CvCapture* capture = 0;
    capture = cvCreateFileCapture(argvp1]);
    if (!capture) {
        return -1;
    }
    IplImage * bgr_frame = cvQueryFram(capture);
    double fps = cvGetCaptureProperty (
        capture,
        CV_CAP_PROP_FPS
    );
    CvSize size = cvSize(
        (int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH),
        (int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT)
    );
    CvVideoWriter *writer = cvCreateViewWriter (
        argv[2],
        CV_FOURCC('M', 'J', 'P', 'G'),
        fps,
        size
   );
   IplImage* logpolar_frame = cvCreateImage(
       size,
       IPL_DEPTH_8U,
       3
   );
   while( (bgr_frame=cvQueryFrame(capture)) != NULL ) {
       cvLogPolar( bgr_frame, logpolar_frame,
           cvPoint2D32f(bgr_frame->width/2,
           bgr_frame->height/2),
           40,
           CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS );
       cvWriterFrame( writer, logpolar_frame);
   }
   cvReleaseVideoWriter( &writer);
   cvReleaseImage( &logpolar_frame);
   cvReleaseCapture( &capture);
   return (0);
}


二、OpenCV 数据类型

类型定义文件在 “.../OpenCV/cxcore/include/cxtypes.h”

1、基本数据类型

结构成员意义
CvPointint x, y图像中的点
CvPoint2D32ffloat x,y二维空间中的点
CvPoint3D32ffloat x,y,z三维空间中的点
CvSizeint width, height图像的尺寸
CvRectint x, y, width, height图像的部分区域
CvScalardouble val[4]RGBA 值


2、CvMat 矩阵结构

cvMat* cvCreateMat( int rows, int cols, int type);
## type 可以是任意预定义类型,预定义类型结构如下:CV_<bit_depth>(S|U|F)C<number_of_channels>
## 可以通过函数 vGetSize(CvMat*), 返回一个CvSize结构,便可以获取任何所需信息,或者通过独立访问高度和宽度,结构为 matrix->height和matrix->width

CvMat结构:矩阵头

typedef struct CvMat {
    int type;
    int step;
    int* refcount;
    union {
        uchar* ptr;
        short*s;
        int* i;
        float* fl;
        double* db;
    }data;
    union {
        int rows;
        int height;
    };
    union {
        int cols;
        int width;
    };
} CvMat;


矩阵创建的多种方法:

1、最常用的方法
cvCreateMat() ; // 由多个原函数组成,如 cvCreateMatheader() /* 创建CvMat 结构,不为数据分配内存 */
                //    和 cvCreateData() /* 只负责数据的内存分配 */
2、cvCloneMat(CvMat*) 

3、cvReleaseMat(CvMat*) // 释放


适合简单的读写:

获取矩阵值:

float element_3_2 = CV_MAT_ELEM(*mat, float, 3,2);

设置矩阵值:

float element_3_2 = 7.7;

*( (float*) CV_MAT_ELEM_PTR( *mat, 3, 2)) = element_3_2;


麻烦的读写:

cvPtr*D 和 cvGet*D : cvPtr1D, cvPtr2D, cvPtr3D,... 

N维数组的 c 维点计算公式:

δ = (row) . Ncols . Nchannels + (col) . Nchannels + (channel)


3、IplImage 数据结构

typedef struct_IplImage {
    int nSize;
    int ID;
    int nChannels;
    int alphaChannels;
    int depth;
    char colorModel[4];
    char channelSeq[4];
    int dataOrder;
    int origin;
    int align;
    int width;
    int height;
    struct _IplROI* roi;
    struct _IplImage* maskROI;
    void* imageId;
    struct _IplTileInfo* tileInfo;
    int imageSize;
    char* imageData;
    int widthStep;
    int BorderMode[4];
    int BorderConst[4];
    char* imageDataOrigin;
} IplImage;

OpenCV 图像类型

图像像素类型
IPL_DEPTH_8U无符号8为整数(8u)
IPL_DEPTH_8S有符号8为整数(8s)
IPL_DEPTH_16S有符号16为整数(16s)
IPL_DEPTH_32S有符号32为整数(32s)
IPL_DEPTH_32D32位浮点数单精度(32f)
IPL_DEPTH_64F64位浮点数单精度(64f)

通道数 nChannels 取值:1,2,3或4.

origin:IPL_ORIGIN_TL 或 IPL_ORIGIN_BL,分别实则坐标原点的为止与图像的左上角或左下角

dataOrder:IPL_DATA_ORDER_PIXEL 或 IPL_DATA_ORDER_PLANE,前者指明数据是将像素点不同通道的值交错排列在一起,后者是把所有像素通道值排在一起,形成通道平面,再把平面排列起来。

widthStep:

ROI:感兴趣的区域 , 实际上它是另一个IPL/IPP 结构IplROI 的实例。 IplROI包含 xOffset, yOffset, height,width 和 coi 成员变量,其中 COI 代表 channel of interest(感兴趣的通道)。


三、矩阵和图像操作

函数名称描述
cvAbs计算数组中所有元素的绝对值
cvAbsDiff计算两个数组差值的绝对值
cvAbsDiffs计算数组和标量差值的绝对值
cvAdd两个数组的元素级的加运算
cvAdds
一个数组和一个标量的元素级的相加运算
cvAddWeighted
两个数组的元素级的加权相加运算(alpha融合)
cvAvg
计算数组中所有元素的平均值
cvAvgSdv
计算数组中所有元素的绝对值和标准差
cvCalcCovarMatrix
计算一组n 维空间向量的协方差
cvCmp
对两个数组中的所有元素运算设置比较操作
cvCmpS
对数组和标量运用设置的比较操作
。。。



四、绘图

直线:cvLine()

void cvLine (
    CvArr* array,
    CvPoint pt1,
    CvPoint pt2,
    CvScalar color,
    int thickness = 1,
    int connectivity = 8
);

圆形和椭圆:

void cvCircle (
    CvArr* array,
    CvPoint center,
    int radius,
    CvScalar color,
    int thickness = 1,
    int connectivity = 8
);

void cvEllipse (
    CvArr* img,
    CvPoint center,
    CvSize axes,
    double angle,
    double start_angle,
    double end_angle,
    CvScalar color,
    int thinkness = 1,
    int line_type = 8
);

多边形:

void cvFillPoly (
    CvArr* img,
    CvPoint** pts,
    int* npts,
    int contours,
    CvScalar color,
    int line_type=8
);

void cvFillConvexPoly (
    CvArr* img,
    CvPoint* pts,
    int* npts,
    CvScalar color,
    int line_type=8
);

void cvPolyLine (
    CvArr* img,
    CvPoint** pts,
    int* npts,
    int contours,
    int is_closed,
    CvScalar color,
    int thickness=1,
    int line_type=8
);


字体和文字:

cvPutText()

void cvPutText(
    CvArr* img,
    const char* text,
    CvPoint origin,
    const CvFont* font,
    CvScalar color
);


五、存储和读取CvMat

CvMat A = cvMat(5,5,CV_32F, the_matrix_data);
cvSave("my_matrix.xml", &A);

CvMat* A1 = (CvMat*)cvLoad("my_matrix.xml");

数据存储函数:

函数名称描述
打开并释放
cvOpenFileStorage为读/写打开存储文件
cvReleaseFileStorage释放存储的数据
写入
cvStartWriterStruct开始写入新的数据结构


。。。












标签: OpenCV C/C++
相关文章
评论留言
发布留言