【发布时间】:2014-04-24 05:28:08
【问题描述】:
嗯,我是 openCV 和图像处理方面的新手,我肯定需要帮助。我需要获取 Mat 的每个像素值。此图像由网络摄像头(实时)捕获。 我已经从一些人的问题中尝试了一些解决方案,但它不适用于我的项目。 这是我的一些代码:
Mat blackWhite;
Mat binary;
Mat distanceTr;
cvtColor(frame, blackWhite, CV_BGR2GRAY);
GaussianBlur(blackWhite, blackWhite, Size(15,15), 6.5, 6.5);
threshold(blackWhite, binary, 80, 255, CV_THRESH_BINARY);
Mat invBinary = Scalar(255) - binary;
distanceTransform(invBinary, distanceTr, CV_DIST_L2,3);
对于像素值的访问,我做了这个:
for(int i = 0; i < distanceTr.rows; i++)
{
for(int j = 0; j < distanceTr.cols; j++)
{
if(distanceTr.at<uchar>(0,0) == 0)
{
cout << 1;
}
}
}
对于网络摄像头节目,我使用
imshow("Project", distanceTr);
据我所知,distanceTr是灰度图,所以是1通道图。根据一些答案,我尝试了 .at 但它不起作用:( 我正在做一个测试用例,如果 (0,0) 像素为黑色,它将打印 1。我得到的是未处理的异常错误。 请问有什么可以帮忙的吗?
非常感谢。 (抱歉英语不好)
【问题讨论】:
-
distanceTrandform的输出图像是CV_32FC1类型的,所以你可能应该这样做:if(distanceTr.at<float>(0,0) == 0) cout<<1 -
@sgar91 是的,非常感谢。它现在正在工作。 :) 我在哪里可以获得关于什么类型的图像给出什么样的输出的信息?像这种情况 distanceTransform 使 CV_32FC1.
-
你为什么在那个循环中一遍又一遍地检查同一个位置(0,0)?没有任何意义。
-
@berak 可能是
(i,j) -
@berak 还处于进程的开始阶段,所以我只想检查 (0,0) 像素是否为黑色。如果是黑色,那么我只打印 1,否则不打印。只是简单的检查。稍后我将其更改为 (i,j)。如果我犯了一些错误,请纠正我。