2

OpenCV ライブラリを使用して、画像内の赤色を囲みます。私はグーグルで多くの質問を見てきましたが、誰も助けてくれませんでした。私のコードは以下の通りです:

void highLightRed(const cv::Mat& inputFrame, cv::Mat& outputFrame)
{
cv::Mat gray, edges, red, blurred;

// blur will enhance edge detection
medianBlur(inputFrame, blurred, 9);

// give image in gray color space
getGray(blurred, gray);

cv::inRange(gray, cv::Scalar(0,0,112), cv::Scalar(60,0,225), red); //BGR

// using Canny algorithm to find edges
cv::Canny(red, edges, 50, 150);

std::vector< std::vector<cv::Point> > c;

// find contours of edges
cv::findContours(edges, c, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);

NSLog(@"size: %lu", c.size());

inputFrame.copyTo(outputFrame);

// draw contour in green (0,200,0) with thinkness 3
//cv::drawContours(outputFrame, c, -1, cv::Scalar(0,200,0),3);
cv::drawContours(outputFrame, c, -1, cv::Scalar(0,200,0),2);

}

void getGray(const cv::Mat& input, cv::Mat& gray)
{
const int numChannes = input.channels();

if (numChannes == 4)
{
    cv::cvtColor(input, gray, cv::COLOR_BGRA2GRAY);
}
}

問題: このコードは、画像に赤と白の色しかない場合に完全に機能し、赤色をうまく囲みます。ただし、複数の色、特に暗い色が関係している場合、色の検出は失敗します。赤色のみを検出する正確な範囲が必要です。ありがとう

4

1 に答える 1

1

BGR または RGB 形式で色の正確な範囲を見つけることは非常に困難です。あなたはそれをたくさんいじる必要があります(あなたが初心者の場合)。

非常に簡単な方法:

  1. を使用して画像をHSV形式に変換しますcvtColor()
  2. HSV imageH、S、V チャンネルの 3 つのチャンネルに分割します。
  3. から赤色を抽出しH-channelます。ここで、赤色の色相範囲を確認できます。
  4. H-channelこの新しいものを古いチャネルSとマージします。V
  5. BGR 形式に変換します。これで、BGR イメージには赤色のみが含まれます。
于 2015-07-15T07:14:41.350 に答える