2012-04-18 9 views
1

JavaCVを使用して実装されたこのプロジェクトで問題が発生しています。私は、少なくとも、二値画像における一番左の一番上の、一番下の、そして最も右側のポイントを見つけたい:JavaCV:バイナリイメージで重要な点を見つける方法

Happy Mouth Binary image

私はここに意味ポイント(x、y)は座標です。私はHoughLinesを実装しようとしましたが(カーブではなく線のみを検出します)、cvFindContoursを実装しましたが、座標を正しく抽出できません。私はまだ初心者ですが、白い線と背景の値が分かっていれば、画像の周りをループすることができます。

より簡単な方法がありますか?助けてくれてどうもありがとう。

+0

あなたはこれについての解決方法を見つけましたか?もしそうなら、答えを教えてください。 –

答えて

2

を対応する機能を使用することができます。ただし、スマートループを作成する方法について考える必要があります。すべてのピクセルをループすることができますが、スマートなアプローチを使用することもできます。たとえば、左端のポイントはおそらく左のどこかにあります。したがって、左から右に向かうスキャンラインを使用する場合は、トップ - >ボトムをスキャンするよりも、このピクセルを見つける可能性が高くなります。これは、画像から値を取得するのはかなり簡単だと言われています。

binaryImgnチャンネルの画像があるとします。グレースケール画像Nの場合は1でなければなりませんが、カラー画像Nの場合、我々はインデックス0 <= y < height0 <= x < width0 <= k < nを持っているとしましょう3.なければなりません。

((uchar *)(binaryImg->imageData + y*binaryImg->widthStep))[x*binaryImg->nChannels + k] 

グレー画像は、単一のチャネルを有しているので、画素が使用白であれば、我々は確認することができ:

((uchar *)(binaryImg->imageData + y*binaryImg->widthStep))[x] == 255 

において我々は、画素(x、y)の値は以下の缶この解はO(n)の最悪の時間を与えますが、実際にはすべてのピクセルを調べる必要はありません。

0

std::vector<cv::Point2f> ptsのような点のベクトルがある場合は、あなたのポイントセットの右上の境界の矩形を計算するopencv cv::boundingRectメソッドを使用できます。 はこのようにそれを使用します。

// this is your set of floating point (filled vector) 
std::vector<cv::Point2f> pts; 
// convert to matrix 
cv::Mat ptsmat(pts); 
// compute the bounding rectangle 
cv::Rect bbox = cv::boundingRect(ptsmat); 

私はC++ OpenCVのAPIを使用しますが、あなたが最も左、右、上、下のポイントを見つけるためにここにループを使用することができますjavacvに

+0

ここでは、KnighKが既にホワイトポイントを見つけていると仮定しています。それは彼が求めている質問の1つです。また、最も左、右、上、下の点に興味を持っている間に、すべての白い点を見つけるべきだと言っているので、最も効率的ではありません。 – dennisg

+0

そうですね、私は彼の質問を急いで行きました。私は提案を追加する:彼は画像を表現し、より簡単にピクセル値(mat.at(x、y))にアクセスするcv :: Matオブジェクトでopencv C++ apiを使うべきである – Eric

関連する問題