0

さんにMat Dist( CV_8U) をしてもらいましたdistanceTransform

ここで、の各座標を確認し、別の値を変更する必要がありDistます> 0Mat 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)
...

距離変換のラベルを使用した場合、ドキュメントには次のように記載されています。

labels – オプションの出力ラベルの 2D 配列 (離散ボロノイ図)。型は CV_32SC1 で、サイズは src と同じです。以下の詳細を参照してください。

したがって、この場合は int としてアクセスする必要があります

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

これがお役に立てば幸いです。

ちなみに、0 の代わりにイプシロン値の方が良いかもしれません....

于 2016-04-06T10:49:43.283 に答える