JavaCVを使用して実装されたこのプロジェクトで問題が発生しています。少なくとも、バイナリイメージの最上部、最下部、左端、右端のポイントを見つけたいと思います。
ここで意味するポイントは(x、y)座標です。HoughLines(線のみを検出し、曲線は検出しません)とcvFindContoursを実装しようとしましたが、座標を正しく抽出できません。私はまだ初心者です。白い線と背景の値がわかれば、画像をループすることができます。
もっと簡単な方法はありますか?助けてくれてありがとう。
JavaCVを使用して実装されたこのプロジェクトで問題が発生しています。少なくとも、バイナリイメージの最上部、最下部、左端、右端のポイントを見つけたいと思います。
ここで意味するポイントは(x、y)座標です。HoughLines(線のみを検出し、曲線は検出しません)とcvFindContoursを実装しようとしましたが、座標を正しく抽出できません。私はまだ初心者です。白い線と背景の値がわかれば、画像をループすることができます。
もっと簡単な方法はありますか?助けてくれてありがとう。
ここでループを使用して、最も左、右、上、下のポイントを見つけることができます。ただし、スマートループを作る方法を考える必要があります。すべてのピクセルをループすることもできますが、よりスマートなアプローチを使用することもできます。たとえば、一番左のポイントは、おそらく左側のどこかにあります。したがって、左から右に進むスキャンラインを使用すると、単に上から下にスキャンする場合よりも、このピクセルを見つける可能性が高くなります。そうは言っても、画像から値を取得するのは非常に簡単です。
nチャンネルの画像binaryImg
があるとします。グレー スケール イメージの場合、nは 1 である必要がありますが、カラー イメージの場合、nは 3 である必要があります。インデックス、およびがあるとします。次のように、ピクセル (x, y) の値を取得できます。0 <= y < height
0 <= x < width
0 <= k < n
((uchar *)(binaryImg->imageData + y*binaryImg->widthStep))[x*binaryImg->nChannels + k]
灰色の画像にはチャネルが 1 つしかないため、以下を使用してピクセルが白かどうかを確認できます。
((uchar *)(binaryImg->imageData + y*binaryImg->widthStep))[x] == 255
速度に関しては、このソリューションは O(n) の最悪のケースの時間を提供しますが、実際にはすべてのピクセルを調べる必要はありません。
次のような点のベクトルがある場合は、点セットの右上の境界矩形を計算する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で対応する関数を使用できます