【问题标题】:Vec3b usage issue and obtaining RGB values at a point in a Mat objectVec3b 使用问题和获取 Mat 对象中某个点的 RGB 值
【发布时间】:2014-09-09 07:51:10
【问题描述】:
for (int row = 0; row < curf->rows; row++)
{
    for (int col = 0; col < curf->cols; col++)
    {
        Vec3b pixcur = curf->at<cv::Vec3b>(row, col);
        cout<<"Pixel values at current point"<<endl<<pixcur.val[0]<<endl<<pixcur.val[1]<<endl<<pixcur.val[2]<<endl;    ###DEBUG STMT ###
        Vec3b pixlast = curl->at<cv::Vec3b>(row, col);
        if (abs(pixcur.val[0]-pixlast.val[0])>checkval ||
            abs(pixcur.val[1]-pixlast.val[1])>checkval ||
            abs(pixcur.val[2]-pixlast.val[2])>checkval)
        {
            numPixelsDiff++;
        }
    }
}

这里的 curf 和 curl 是指向两个 Mat 对象的指针。我知道它们指向实际的 Mats,因为 curf->rows 和 curf->cols 的值输出实际整数。

但是我用### DEBUG STMT ### 标记的行的输出总是垃圾。 checkval 是在进入循环之前设置的变量。 vec3b 向量中的值不正确。

我也试过了

for (int row = 0; row < curf->rows; row++)
{
    for (int col = 0; col < curf->cols; col++)
    {
         Vec3b pixcur = curf->at<cv::Vec3b>(row, col);
         cout<<"Pixel values at current point"<<endl<<pixcur[0]<<endl<<pixcur[1]<<endl<<pixcur[2]<<endl;    ###DEBUG STMT ###
         Vec3b pixlast = curl->at<cv::Vec3b>(row, col);
         if (abs(pixcur[0] - pixlast[0]) > checkval ||
             abs(pixcur[1] - pixlast[1]) > checkval ||
             abs(pixcur[2] - pixlast[2]) > checkval)
         {
             numPixelsDiff++;
         }
     }
}

它再次只输出垃圾符号。

我在这里做错了吗?我应该检查其他东西吗?我是 opencv 的完整新手,因此我将不胜感激。

【问题讨论】:

    标签: c++ opencv


    【解决方案1】:
    1. 避免指向cv::Mat 的指针,因为你迟早会以这种方式破坏内部refcount。使用引用,或者敢于复制它(无论如何都是浅拷贝)。

    2. 打印字节时,使用:cout &lt;&lt; int(pixcur[0])。你需要演员表,否则cout 将看到uchar,并打印ascii。 (或者只是做cout &lt;&lt; pixcur;

    3. 避免每像素循环。几乎在任何情况下,都有一个内置函数,它可以更好、更快地完成工作,并且出错的机会更少。例如,有absdiff()countNonZero()

    【讨论】:

    • 好答案。但是,我认为countNonZero 不适用于多通道数组,因此可能在 absdiff() 之后需要一个循环,以查看有多少字节三元组包含至少一个非零值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-13
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    • 2012-12-27
    相关资源
    最近更新 更多