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:对同一大小的图固定查看区域