5

この質問は、VS2008 Express の c++ を使用した opencv に関するものです。

私は非常に単純なことをしています。カメラ画像から肌の値を取得しようとしています。

スクリーンショットでわかるように、カメラの画像はかなりきれいに見えます。私はそれを HSV に変換し、色相チャネルをそれから分離して、後でスキン値のしきい値を設定しています。しかし、Hue チャンネルはノイズが多すぎて粒子が粗いようです。また、HSV 画像ウィンドウには情報の劣化が見られます。なぜそれが起こっているのですか?&それを解決する方法。できない場合は、何らかの平滑化によってノイズを除去できますか? コードは次のとおりです。

#include <opencv2/opencv.hpp>
int main(){
    cv::VideoCapture cap(0); // open the default camera   
    cv::Mat hsv, bgr, skin;//make image & skin container
    cap >> bgr; 
    //cvNamedWindow("Image");
    //cvNamedWindow("Skin");    
    //cvNamedWindow("Hue");
    cv::cvtColor(bgr, hsv, CV_BGR2HSV);
    std::vector<cv::Mat> channels;
    cv::split(hsv, channels);
    cv::Mat hue;
    hue = channels[0];  
    cv::imshow("Image", bgr);cvMoveWindow("Image",0,0);
    cv::imshow("HSV", hsv);cvMoveWindow("HSV",660,0);
    cv::imshow("Hue", hue);cvMoveWindow("Hue",0,460);   

    cvWaitKey(0);//wait for key press   
    return 0;   
}

ここに画像の説明を入力

4

2 に答える 2

6

色相チャンネルはノイズが多すぎて粒子が粗いようです。なぜそれが起こっているのですか?

私たちが目にする実際の色では、「色相」によって表される情報の部分が異なります。赤は色相によって完全に表現されます。黒には色相情報がまったくありません。

ただし、このように HSV で色を表現すると、色相は常に色情報の 3 分の 1 になります

そのため、色がグレーの色合いに近づくと、色相コンポーネントが人為的に膨らみます。それがあなたが見ている粒状性です。グレーに近いほど、キャプチャされた色相のエラーを含め、より多くの色相を増幅する必要があります。

また、HSV 画像ウィンドウには情報の劣化が見られます。なぜそれが起こっているのですか?

変換では丸め誤差が発生しますが、おそらく思ったほどではありません。HSV イメージを BGR に変換して、実際にどの程度の劣化が発生したかを確認してください。

&それを解決する方法。

現実的には、2 つの選択肢があります。

高品質のカメラを使用するか、HSV 形式を使用しないでください。

于 2013-03-03T18:42:22.540 に答える
1

cvtColorパラメータCV_BGR2HSVを持つ関数のOpenCVドキュメントの式を見ると、

ここに画像の説明を入力

ここに画像の説明を入力

ここに画像の説明を入力

ここで、灰色の色合いがある場合、つまり R が B に等しく、R が G に等しい場合、H 式の分数は常に定義されていません。これは、0 を 0 で割った値だからです。ドキュメントには、その場合に何が起こるかが説明されていないように思えます。

于 2015-01-23T10:38:47.800 に答える