Vec3b使用问题并在Mat对象中的某个点获取RGB值

时间:2014-09-09 07:51:10

标签: c++ opencv

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-&gt; rows和curf-&gt; 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的完全新手,所以我会感激任何帮助。

1 个答案:

答案 0 :(得分:3)

  1. 避免指向cv::Mat,因为迟早会以这种方式颠倒内部refcount。使用引用,或敢于复制它(无论如何它都是浅层复制品。)

  2. 打印字节时,请使用:cout << int(pixcur[0])。你需要演员,或cout会看到uchar,并打印ascii。 (或只做cout << pixcur;

  3. 避免逐像素循环。几乎在任何情况下,都有一个内置函数,即更好,更快,更少出错的机会。例如,有absdiff()countNonZero()