OpenCV 学习笔记

  • OpenCV2.0中,很多函数在Debug中一旦出错,VS就会跳到一个xstring文件中,导致程序员无法判断具体出错位置,只能逐行调试。个人猜测这是OpenCV 2.0的Exception handle语句的一个bug,不知2.1版修正没有。不过倒是有一个简单的解决办法:将OpenCV源代码中的CV_Assert和CV_Error,改成assert和assert(0),重新编译。
  • 在子线程中用cvShowImage操作图像显示窗口,似乎会引发一些奇怪的错误。
  • cvCreateImage(size, depth, channel)
    depth:
    IPL_DEPTH_1U     1
    IPL_DEPTH_8U - 无符号8位整型
    IPL_DEPTH_8S - 有符号8位整型
    IPL_DEPTH_16U - 无符号16位整型
    IPL_DEPTH_16S - 有符号16位整型
    IPL_DEPTH_32S - 有符号32位整型
    IPL_DEPTH_32F - 单精度浮点数
    IPL_DEPTH_64F - 双精度浮点数
  • 要release,destroy的:image,mat,window,cascade,memstorage,capture
  • 应尽量遵守谁分配,谁释放的准则
  • 读写矩阵元素的函数:

function           elem_type    channel  dim
mGet                float,double 1             2
GetReal*D       all                 1             all
Get*D              all                all            all
CV_MAT_ELEM all                all            2
例子:
CvMat* vector = cvCreateMat( 1, 3, CV_32SC2 );
CV_MAT_ELEM( *vector, CvPoint, 0, 0 ) = cvPoint(100,100);

  • 有关数据类型、格式转换的相关操作:
    获取矩阵类型:cvGetElemType。例:cvCreateMat(h, w, cvGetElemType(src_arr))
    获取图像、矩阵深度:((IplImage *)src)->depth/nChannels;((cvMat *)src)->type
    32位->8位要用cvConvertScale(a, b, 255)
    8位->32位要用cvConvertScale(b, a, 1.0/255);
    将CvArr转换为CvMat/IplImage:cvGetMat、cvGetImage
    由矩阵类型获取通道数、深度:CV_MAT_CN(type),CV_MAT_DEPTH;反过来:CV_MAKETYPE(depth,cn)
  • cvSaveImage似乎必须是8位图像
  • 传给ReleaseImage函数一个空指针、错指针似乎不会报错
  • 摄像头初始化时报错:观察加载的dll,删除与项目无关的dll,如Nero, 暴风等
  • CvMat *sub = cvGetSubRect(m,&tmpHeader,rc) 返回的指针似乎就是传入的tmpHeader的地址;
    但CvMat *m = cvGetMat(arr, &tmpHeader)如果传入的就是矩阵,则传入的tmpHeader不被初始化,返回的仍是arr.传入img似乎会被初始化。
  • 一些cxtypes.h中的有用宏定义:

#define CV_ARE_TYPES_EQ(mat1, mat2) /
    ((((mat1)->type ^ (mat2)->type) & CV_MAT_TYPE_MASK) == 0)

#define CV_ARE_CNS_EQ(mat1, mat2) /
    ((((mat1)->type ^ (mat2)->type) & CV_MAT_CN_MASK) == 0)

#define CV_ARE_DEPTHS_EQ(mat1, mat2) /
    ((((mat1)->type ^ (mat2)->type) & CV_MAT_DEPTH_MASK) == 0)

#define CV_ARE_SIZES_EQ(mat1, mat2) /
    ((mat1)->height == (mat2)->height && (mat1)->width == (mat2)->width)

#define CV_IS_MAT_CONST(mat)  /
    (((mat)->height|(mat)->width) == 1)

/* size of each channel item,
   0x124489 = 1000 0100 0100 0010 0010 0001 0001 ~ array of sizeof(arr_type_elem) */
#define CV_ELEM_SIZE1(type) /
    ((((sizeof(size_t)<<28)|0x8442211) >> CV_MAT_DEPTH(type)*4) & 15)

/* 0x3a50 = 11 10 10 01 01 00 00 ~ array of log2(sizeof(arr_type_elem)) */
#define CV_ELEM_SIZE(type) /
    (CV_MAT_CN(type) << ((((sizeof(size_t)/4+1)*16384|0x3a50) >> CV_MAT_DEPTH(type)*2) & 3))
    #define CV_PI   3.1415926535897932384626433832795
#define CV_LOG2 0.69314718055994530941723212145818

#define CV_SWAP(a,b,t) ((t) = (a), (a) = (b), (b) = (t))

#ifndef MIN
#define MIN(a,b)  ((a) > (b) ? (b) : (a))
#endif

#ifndef MAX
#define MAX(a,b)  ((a) < (b) ? (b) : (a))
#endif

/* min & max without jumps */
#define  CV_IMIN(a, b)  ((a) ^ (((a)^(b)) & (((a) < (b)) - 1)))

#define  CV_IMAX(a, b)  ((a) ^ (((a)^(b)) & (((a) > (b)) - 1)))

/* absolute value without jumps */
#ifndef __cplusplus
#define  CV_IABS(a)     (((a) ^ ((a) < 0 ? -1 : 0)) - ((a) < 0 ? -1 : 0))
#else
#define  CV_IABS(a)     abs(a)
#endif
#define  CV_CMP(a,b)    (((a) > (b)) - ((a) < (b)))
#define  CV_SIGN(a)     CV_CMP((a),0)

  • 随机数:
     CvRNG rng_state = cvRNG(cvGetTickCount());
     cvRandArr(&rng_state, m, CV_RAND_UNI, cvScalar(0), cvScalar(1));
     cvRandInt
     

你可能感兴趣的:(exception,function,image,vector,dll,Types)