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的完全新手,所以我会感激任何帮助。
答案 0 :(得分:3)
避免指向cv::Mat
,因为迟早会以这种方式颠倒内部refcount
。使用引用,或敢于复制它(无论如何它都是浅层复制品。)
打印字节时,请使用:cout << int(pixcur[0])
。你需要演员,或cout
会看到uchar
,并打印ascii。 (或只做cout << pixcur;
)
避免逐像素循环。几乎在任何情况下,都有一个内置函数,即更好,更快,更少出错的机会。例如,有absdiff()
和countNonZero()
。