【问题标题】:Defining cv::Mat in header followed by another Mat avoids multiple channels在标题中定义 cv::Mat 后跟另一个 Mat 避免了多个通道
【发布时间】:2012-12-03 16:13:23
【问题描述】:

我刚刚遇到了一个奇怪的问题。在我班级的标题中,我定义了多个cv::Mat,如下所示:
cv::Mat drawing, img_grad, img_bright, img_cov; (ver1)
cv::Mat drawing, img_grad, img_bright, img_cov, img_notused; (ver2)

在代码中,我将 img_cov 定义如下:
img_cov = Mat::zeros( somemat.size(), CV_32FC(6) )
奇怪的是,如果我将另一个 Mat 添加到我的多个 Mats 的标题声明(参见上面的 ver2)中,即使 img_notused 它从未使用过,我也无法访问我的 img_cov 的任何其他频道而不是 0 . 访问例如通过img_cov.at<float>( j, i, 1) 导致崩溃。

似乎是一个mermoy分配的事情。有人可以向我解释一下吗?

【问题讨论】:

    标签: c++ memory-management opencv


    【解决方案1】:

    你使用了错误的命令来访问图像值(它应该在早些时候崩溃,也许你在发布模式下编译......)。

    你的行应该是这样的:

    typedef Vec<6,float> Vec6f;
    Vec6f pixel = img_cov.at<Vec6f>(i,j); 
    float value_you_look_for = pixel[1]; // note that 1 means the second channel of 6.
    

    因为CV_32FC(6) 表示一个6 通道矩阵,通道中有float 值。

    供您参考:link to specific docs

    【讨论】:

    • 谢谢,但是我在第一篇文章中写它的方式确实提供了错误的结果,但是为什么它根本返回结果,因为我没有在访问后的标题中声明任何其他 Mat 呢?遗憾的是,我没有将&lt;float&gt; 放在代码标记中,这就是该网站没有以这种方式显示的原因。不管怎样,以您的方式访问值适用于“Ver1”和“Ver2”。但这是否解释了上面提到的奇怪行为?
    • 我的方法适用于 Ver1 和 Ver2,因为它是正确的。你的方法是偶然的。编译器可能会根据变量的数量提供不同的内存布局,并且最初您更接近分配内存的限制边界。不过,返回的值在您的 Ver1 和 Ver2 中会出错,请尝试显示它。
    • 是的,它们确实是完全错误的,而且非常非常小。奇怪,在某个地方我对img_cov.at&lt;float&gt;( j, i, 1)-command 很感兴趣,但显然这是一条错误的路径。谢谢!
    猜你喜欢
    • 2014-06-01
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    • 2021-11-16
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    • 2016-09-08
    相关资源
    最近更新 更多