1

JavaCVを使用して実装されたこのプロジェクトで問題が発生しています。少なくとも、バイナリイメージの最上部、最下部、左端、右端のポイントを見つけたいと思います。

HappyMouthバイナリ画像

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

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

4

2 に答える 2

2

ここでループを使用して、最も左、右、上、下のポイントを見つけることができます。ただし、スマートループを作る方法を考える必要があります。すべてのピクセルをループすることもできますが、よりスマートなアプローチを使用することもできます。たとえば、一番左のポイントは、おそらく左側のどこかにあります。したがって、左から右に進むスキャンラインを使用すると、単に上から下にスキャンする場合よりも、このピクセルを見つける可能性が高くなります。そうは言っても、画像から値を取得するのは非常に簡単です。

nチャンネルの画像binaryImgがあるとします。グレー スケール イメージの場合、nは 1 である必要がありますが、カラー イメージの場合、nは 3 である必要があります。インデックス、およびがあるとします。次のように、ピクセル (x, y) の値を取得できます。0 <= y < height0 <= x < width0 <= k < n

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

灰色の画像にはチャネルが 1 つしかないため、以下を使用してピクセルが白かどうかを確認できます。

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

速度に関しては、このソリューションは O(n) の最悪のケースの時間を提供しますが、実際にはすべてのピクセルを調べる必要はありません。

于 2012-04-18T10:24:46.130 に答える
0

次のような点のベクトルがある場合は、点セットの右上の境界矩形を計算するstd::vector<cv::Point2f> ptsopencv メソッドを使用できます。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で対応する関数を使用できます

于 2012-04-18T10:19:32.753 に答える