在opencv中获取submat的区别

时间:2015-08-26 14:03:28

标签: c++ opencv

我测试了以下两个片段,它们给出了不同的结果。第二个是对的。我不明白为什么会这样,我想知道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]<<" ";
        }
    }
}

1 个答案:

答案 0 :(得分:1)

mat2File似乎是罪魁祸首。

M_ptr[i*M.cols+j]对于非连续矩阵不正确,因为矩阵行之间的间距大于M.cols。您最好使用M.at<uchar>(y,x)来访问Mat像素。