c++ - 在opencv中获取submat的区别

标签 c++ opencv

我测试了以下两个片段,它们给出了不同的结果。第二个是对的。我不明白这是为什么,我想知道是不是opencv有bug?

结果矩阵 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 像素。

关于c++ - 在opencv中获取submat的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32228878/

相关文章:

python - 实时视频稳定 OpenCV

c++ - Homebrew 中没有用于 opencv 安装的选项

java - Android:将 calcOpticalFlowPyrLK 与 MatOfPoint2f 结合使用

c++ - 为什么在按值返回时创建临时对象而不是在按值传递给函数参数时创建临时对象

python - boost需要特殊的python模块才能在linux中构建吗

c++ - 为什么 c++ Header Guards 名称大写并带有下划线?

c++ - 如何将对象添加到类中的静态 vector

opencv - 如何将OpenCV功能描述符标准化为整数比例?

python - 检查轮廓的任何点是否与一条线相交的有效方法是什么?

c++ - 为什么我在 C++ 中不断收到错误消息 "a function-definition is not allowed here before ' {' token"?