2

色認識のために変換している画像に少し問題があります。

関数は次のようになります。

void PaintHSVWindow(cv::Mat img){
cv::Mat HSV, threshold; 
cvtColor(img, HSV, COLOR_BGR2HSV);
inRange(HSV, cv::Scalar(HMin, SMin, VMin), cv::Scalar(HMax, SMax, VMax), threshold);
Mat erodeElement = getStructuringElement(MORPH_RECT, cv::Size(3, 3));
Mat dilateElement = getStructuringElement(MORPH_RECT, cv::Size(8, 8));
erode(threshold, threshold, erodeElement);
dilate(threshold, threshold, dilateElement);
cv::resize(threshold, threshold, cv::Size(360, 286));
MyForm::setHSVWindow(threshold);

}

出力は次のようになります。

左側が入力、右側が出力、黄色のボールを見つけるためのフィルタリング

左がインプット。右側は同じ画像で、HSV に変換さ、指定されたしきい値間でフィルター処理されて黄色のボールが検出され、小さな輪郭を削除するために浸食および膨張され、元の画像の半分のサイズで表示されます。代わりに、期待される画像を取得し、それらの 3 つを同じスペースに押しつぶします。

なぜこれが起こるのかについての推測はありますか?


更新 1:

OK、右側のサイズの画像で findContours を実行しても適切な出力が得られるようです。つまり、3回コピーされた歪んだ右側の画像の輪郭を左側の右側の位置に貼り付けることができます。 -側の入力画像、私は歪んだ画像を取得し、表示目的でトリミングすることにしました。これは、画像内の特定の HSV 範囲の輪郭を見つけるためにのみ使用されます。その目的に役立つなら、私は満足しています。

4

1 に答える 1

-1

@Nallath がコメントしているように、これは明らかにチャネルの問題です。ドキュメントによると、 の出力は、すべてのチャネルを含む 論理でinRange()ある 1 チャネルのイメージである必要があります。CV_8UAND

あなたの結果は、途中のどこかthresholdが 3 チャンネルの平面順序の画像のように扱われていることを意味します。

どのバージョンの OpenCV を使用していますか?

thresholdこの変換が発生する場所を見つけるために、すべてのステップの間に表示することをお勧めします. これは、報告すべきバグである可能性があります。

于 2014-06-12T06:27:00.167 に答える