4

私の質問はOpenCV に似ています: ビデオ フィードで点滅するライトを検出する openCV は点滅するライトを検出します

LED オブジェクトを持つ任意の画像から LED のオン/オフ状態を検出したい。LED オブジェクトは任意のサイズにすることができます (ただし、ほとんどは円です)。オンまたはオフにすることができますが、そのイメージ内のすべての LED の位置を取得することが重要です。まず、ON のみの LED の状態と位置を取得したいと思います。現在、私のワークアウト用の画像ソースは静的ですが、LED が光っている製品のビデオからのものでなければなりません。そのため、テンプレート画像で背景を差し引く可能性はありません。

OpenCV (OpenCV の新機能) をしきい値、Contours、および Circles メソッドで使用しようとしましたが、成功しませんでした。ソースコードまたはソリューションがあれば共有してください。解決策は、OpenCVを使用するだけでなく、私に結果をもたらすものであれば何でもかまいません。それは大歓迎です。

他の 2 つの質問との違いは、画像内の LED の数と、すべての LED の状態を取得したいということです。私はこれが非常に複雑であることを知っています。まず、画像内の光る LED を検出しようとしました。以下で共有したコードを実装しました。さまざまな実装がありましたが、以下のコードは輪郭を描くだけで光る LED を表示できますが、輪郭の数は光る LED よりも多くなります。そのため、少なくとも光っている LED の総数を取得できません。あなたの意見を提案してください。

int main(int argc, char* argv[])
{

IplImage* newImg = NULL;
IplImage* grayImg = NULL;
IplImage* contourImg = NULL;
float minAreaOfInterest = 180.0;
float maxAreaOfInterest = 220.0;
//parameters for the contour detection
CvMemStorage * storage = cvCreateMemStorage(0);
CvSeq * contours = 0;
int mode = CV_RETR_EXTERNAL;
mode = CV_RETR_CCOMP; //detect both outside and inside contour
cvNamedWindow("src", 1);
cvNamedWindow("Threshhold",1);
//load original image
newImg = cvLoadImage(argv[1], 1);

IplImage* imgHSV = cvCreateImage(cvGetSize(newImg), 8, 3);
cvCvtColor(newImg, imgHSV, CV_BGR2HSV);

cvNamedWindow("HSV",1);
cvShowImage( "HSV", imgHSV );
IplImage* imgThreshed = cvCreateImage(cvGetSize(newImg), 8, 1);

cvInRangeS(newImg, cvScalar(20, 100, 100), cvScalar(30, 255, 255), imgThreshed);
cvShowImage( "src", newImg );

cvShowImage( "Threshhold", imgThreshed );

//make a copy of the original image to draw the detected contour
contourImg = cvCreateImage(cvGetSize(newImg), IPL_DEPTH_8U, 3);
contourImg=cvCloneImage( newImg );
cvNamedWindow("Contour",1);
//find the contour
cvFindContours(imgThreshed, storage, &contours, sizeof(CvContour), mode, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));
int i = 0;
for (; contours != 0; contours = contours->h_next)
{
    i++;
    //ext_color = CV_RGB( rand()&255, rand()&255, rand()&255 ); //randomly coloring different contours      
    cvDrawContours(contourImg, contours, CV_RGB(0, 255, 0), CV_RGB(255, 0, 0), 2, 2, 8, cvPoint(0,0));
}
printf("Total Contours:%d\n", i);
cvShowImage( "Contour", contourImg );

cvWaitKey(0);
cvDestroyWindow( "src" ); cvDestroyWindow( "Threshhold" );
cvDestroyWindow( "HSV" );
cvDestroyWindow( "Contour" );
cvReleaseImage( &newImg ); cvReleaseImage( &imgThreshed ); 
cvReleaseImage( &imgHSV );
cvReleaseImage( &contourImg );



}
4

1 に答える 1

8

昨日の夜、少し時間があります。これは、私にとってはうまくいく(非常に)単純で部分的な解決策です。直接クローンできるgitリポジトリを作成しました:

git://github.com/jlengrand/image_processing.git

Pythonを使用して実行します

$ cd image_processing/LedDetector/
$ python leddetector/led_highlighter.py

ここでコードを見ることができます

私の方法:

  • 1チャンネル画像に変換
  • 画像のように少なくとも 1 つの LED がオンで背景が暗いと仮定して、最も明るいピクセルを検索します。
  • イメージの最も明るい部分でバイナリ イメージを作成する
  • 画像からブロブを抽出し、その中心と LED の数を取得します。

この時点では、コードは画像のみを考慮していますが、ループを使用して画像のバッチを取得することでコードを拡張できます (私のレポには、いくつかのサンプル画像が既に用意されています)。 LED の場合、1 つの画像から別の画像への 1 ピクセルの精度ではない可能性があるため (中心がわずかにずれている可能性があります)。

アルゴリズムをより堅牢にする(LED が点灯しているかどうかを認識し、ハードコードされていない自動マージン値を見つける) ために、ヒストグラム( extract_brightに配置) を少しいじることができます。私はすでに関数を作成しましたが、それを少し強化する必要があります。

入力データに関するその他の情報: Opencvは今のところ avi ファイルのみを受け入れるため、mp4 ファイルを avi に変換する必要があります (私の場合は圧縮されていません)。私はこれを使用しました。これは完全に機能しました。何らかの理由で、queryframe関数がコンピューターでメモリ リークを引き起こしました。そのため、avi ファイルを入力として受け取り、簡単に使用できる jpg 画像のバッチを作成する、 grab_images関数を作成しました。

画像の結果は次のとおりです。

入力画像:

入力例

バイナリ イメージ :

バイナリ結果 (画像の最も明るい部分)

最終結果 :

最終結果 (LED を囲むバウンディング ボックス)

お役に立てれば。. .

編集 :

この画像を使用する場合、問題は少し複雑になります。私が投稿した方法は引き続き使用できますが、少し複雑にする必要があります。

「情報」(ステータス、帯域幅など) を表示する LED を検出し、設計部分を破棄します。

これには 3 つの簡単な解決策があります。

  • あなたはLEDの位置についての以前の知識を持っています. この場合、まったく同じ方法を適用できますが、画像全体の正確な部分に適用できます (cv.SetImageROI を使用)。
  • あなたは、LED の色についての事前知識を持っています (2 つの異なる色があることを画像で確認できます)。次に、画像全体を検索し、カラー フィルターを適用して選択を制限します。
  • あなたには予備知識がありません。この場合、事態はもう少し複雑になります。役に立たない LED はすべて同じ色にする必要があり、ステータス LED は通常点滅すると言いがちです。これは、メソッドに学習ステップを追加することで、実際にどの LED を有用として選択する必要があるかを確認できる可能性があることを意味します。

これが思考のためのいくつかのより多くの食物をもたらすことを願っています

于 2012-05-25T07:34:03.387 に答える