我测试了以下两个片段,它们给出了不同的结果。第二个是对的。我不明白为什么会这样,我想知道opencv中是否有错误?
结果矩阵f_sub在这些示例中是不同的。
1)
Mat f = Mat::zeros(96,112,CV_8UC1);
randu(f,0,255);
Mat f_sub = f(cv::Rect(17,14,78,68));
//mat2File("f.mm",f,1);
//mat2File("f_sub.mm",f_sub,1);
exit(0);
2)
Mat f = Mat::zeros(96,112,CV_8UC1);
randu(f,0,255);
Mat f_sub = f(cv::Rect(17,14,78,68)).clone();
//mat2File("f.mm",f,1);
//mat2File("f_sub.mm",f_sub,1);
exit(0);
mat2File只是将垫子打印到文件中
void mat2File(string filename, Mat M, int y)
{
ofstream fout(filename.c_str());
//fout << M.rows<<" "<<M.cols<<endl;
uchar *M_ptr = (uchar*)M.ptr();
for(size_t i=0; i<M.rows; i++)
{
fout<<endl;
for(size_t j=0; j<M.cols; j++)
{
fout<< (size_t)M_ptr[i*M.cols+j]<<" ";
}
}
}
答案 0 :(得分:1)
mat2File
似乎是罪魁祸首。
M_ptr[i*M.cols+j]
对于非连续矩阵不正确,因为矩阵行之间的间距大于M.cols
。您最好使用M.at<uchar>(y,x)
来访问Mat像素。