CV-openCV学习笔记一

来源:互联网 发布:三国志11全人物数据 编辑:程序博客网 时间:2024/05/16 04:46

openCV官方文档

导论

命名空间

using namespace cv;

自动内存管理

// 创建一个8Mb矩阵Mat A(1000, 1000, CV_64F);// 为同一个矩阵创建另外一个header// 这是一个即时操作,无论矩阵大小Mat B = A;// 为A的第三行创建另外一个header,同理没有数据复制产生Mat C = B.row(3);// 现在创建A的拷贝Mat D = B.clone();// .将B的第五行复制到C,也即是,将A的第五行复制到A的第三行B.row(5).copyTo(C);// 让A和D共享同一矩阵,而原来的A仍然被B和C引用A = D;// 现在释放B(不指向任何内存空间),但是原来的A仍然被C引用,尽管C仅仅引用一行B.release();// 最后,创建了一个C的拷贝,且C指向了这个拷贝。这时,原来的A会被释放,因为它不再被任何人引用。C = C.clone();

指针:

T* ptr = new T(...);

使用Ptr<T> ptr(new T(...));Ptr<T> ptr = makePtr<T>(...); 代替

自动为输出数据分配空间

饱和算法

图像类型的强制转换:
8bit图像:I(x,y)=min(max(round(r),0),255),其它类推
代码:I.at<uchar>(y, x) = saturate_cast<uchar>(r);

Mat泛型

Mat mtx(3, 3, CV_32F); // 3x3 浮点 1通道 矩阵Mat cmtx(10, 1, CV_64FC2); // 10x1 2通道 浮点 矩阵                           // 10个复向量Mat img(Size(1920, 1080), CV_8UC3); // 1080x1920(只有Size有这种效果)3通道 8位无符号整数Mat grayscale(image.size(), CV_MAKETYPE(image.depth(), 1)); // image的大小和深度,1通道

有关宏定义CV_XXX:
CV_8U,CV_8S:8位无符号数uchar;8位符号数schar
CV_16U,CV_16S:16位无符号数ushort;16位符号数short
CV_32S:32位符号数int
CV_32F,CV_64F:32位浮点数float;64位浮点数double
在上面宏定义后面
C+1~4:代表有几个通道,大于4或者编译时不知道通道数的情况下使用C(n),或者CV_MAKETYPE(CV_8U, n)
CV_32FC1 == CV_32F, CV_32FC2 == CV_32FC(2) == CV_MAKETYPE(CV_32F, 2)
CV_MAKETYPE(depth, n) == ((depth&7) + ((n-1)<<3)

输入输出数组

如Mat, std::vector<>, Matx<>, Vec<> 或 Scalar这类,你可以照常使用,如果函数需要额外的数组而你又不想传参的话,使用cv::noArray()

错误处理

try{    ... // call OpenCV}catch( cv::Exception& e ){    const char* err_msg = e.what();    std::cout << "exception caught: " << err_msg << std::endl;}

有以下抛出错误的方法:
CV_Error(errcode, description)CV_Error_(errcode, printf-spec, (printf-args))
CV_Assert(condition)CV_DbgAssert(condition)

多线程与可重入性

Image Watch插件

下载:http://go.microsoft.com/fwlink/?LinkId=285460
视图->其他视图->image watch->Debug调试
Link Views:对同一大小的图固定查看区域

载入显示图像

0 0
原创粉丝点击