opencv2.3.1随记
1. 关于Mat的row操作
cv::Mat mat1 = cv::Mat(2,2,CV_64F); mat1.at<double>(0,0) = 1;mat1.at<double>(0,1) = 2; mat1.at<double>(1,0) = 3;mat1.at<double>(1,1) = 4; cv::Mat mat2 = cv::Mat(2,2,CV_64F); mat2.row(0) = mat1.row(0); mat2.row(1) = mat1.row(1); std::cout<<mat1<<std::endl; std::cout<<mat2<<std::endl;
按照以上代码,mat2并没有被正确赋值,而改成下面这样就对了
cv::Mat mat1 = cv::Mat(2,2,CV_64F); mat1.at<double>(0,0) = 1;mat1.at<double>(0,1) = 2; mat1.at<double>(1,0) = 3;mat1.at<double>(1,1) = 4; cv::Mat mat2 = cv::Mat(2,2,CV_64F); mat2.row(0) = mat1.row(0)+0; mat2.row(1) = mat1.row(1)+0; std::cout<<mat1<<std::endl; std::cout<<mat2<<std::endl;
2. Mat.at在debug下有越界检查,但在release下没有
例如下面代码
cv::Mat mat = cv::Mat(2,2,CV_32F); std::cout<<mat.at<float>(10,10)<<std::endl;
在release下能够通过编译并运行,但在debug下会触发越界错误。因此,这种对Mat元素的存取操作在release下比debug下快很多,尤其对于较大的数组。