0

しきい値を使用して、バスケット内の赤いボールを検出しようとしています。私の問題は、結果が単に黒であるため、間違ったスカラー値を持っていると思うことです。どのベクトルチャンネルが輝度、色相、彩度、明るさなのかわかりません

enter code here
 Mat  onespoon= image[2];
 Mat onespoonnewcolor;
 Mat newspoon;

 cvtColor(onespoon, onespoonnewcolor, CV_BGR2HSV);

 inRange(onespoonnewcolor, Scalar(30,0,60,30), Scalar(70,7,100,70), newspoon);
 namedWindow( "Display window", CV_WINDOW_AUTOSIZE );// Create a window for     display.
 imshow( "Display window", newspoon );                   // Show our image inside it.
4

1 に答える 1

3

HSV 色空間に変換しています。つまり、1 番目、2 番目、3 番目のイメージ チャネルは、色相、彩度、明度に対応します。4 番目のチャネルはないため、Scalar引数には 3 つの要素のみを含める必要があります。

OpenCV では、色相の範囲は 0 から 180 で、彩度と値の範囲は 0 から 255 です。

投稿されたサンプル画像がなければ、正しい色相角度の範囲を推測することしかできません. これは、範囲内の色相値が適切に機能する可能性があることを示唆してい[0, 15]ます[165,180]。赤はスペクトルのゼロ点を囲むため、これには を 2 回適用する必要がありますcv::inRange()。色相と彩度については、 range を使用して低い値を破棄します[20,255]

コードは次のようになります。その後newspoon、両方のinRangeパスの結果が含まれます。

cv::Mat temp1, temp2;
cv::inRange(onespoonnewcolor, cv::Scalar(0,20,20), cv::Scalar(15,255,255), temp1);
cv::inRange(onespoonnewcolor, cv::Scalar(165,20,20), cv::Scalar(180,255,255), temp2);
cv::Mat newspoon;
cv::bitwise_or(temp1, temp2, newspoon);

コメントで指摘されているように、 を 1 回呼び出すだけでこれを行うことができますinRange()。これはより効率的で、いくつかの一時変数を排除します。

cv::Mat newspoon;
cv::inRange(onespoonnewcolor, cv::Scalar(16,20,20), cv::Scalar(164,255,255), newspoon);
newspoon = 255 - newspoon;
于 2013-10-17T15:09:36.040 に答える