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

最佳答案

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

09-28 06:50