0

我有一个Mat Dist( CV_8U) 由 完成distanceTransform

现在我必须检查Distis的每个坐标> 0并修改另一个的值Mat M = Mat :: zeros

代码是

      int main(){
              ....

               for(i=0;i<Dist.rows;++i)
               {
                    for(j=0;j<Dist.cols;++j)
                    {
                   if(Dist.at<uchar>(i,j) > 0){
                     M.at<uchar>(i,j)=2;
                      }
                    }
              }
            ....
            }

但我错误 cv :: 异常。

我查看了文档和其他地方,我试图从 uchar 更改为 vec3b 。我在 Visual Studio 2015 中修改了异常,但没有。我哪里错了?

4

1 回答 1

0

该函数distanceTransform不返回广告 CV_8U,它是 CV_32,我们可以在文档中看到:

dst – 具有计算距离的输出图像。它是一个与 src 大小相同的 32 位浮点单通道图像。

所以代码不应该读uchar,而是float

...
if(Dist.at<float>(i,j) > 0.f)
...

如果您使用距离变换的标签,在文档中我们有以下内容:

标签——可选的输出二维标签数组(离散 Voronoi 图)。它的类型为 CV_32SC1,大小与 src 相同。请参阅下面的详细信息。

因此,在这种情况下,您应该将其作为 int 访问

...
if(Dist.at<int>(i,j) > 0)
...

我希望这可以帮助你。

顺便说一句,也许一个 epsilon 值而不是 0 会更好....

于 2016-04-06T10:49:43.283 回答