16

AndroidフォンでOpenCVを使用して回線を検出しようとしています。「Tutorial 1 Basic - 2. Use OpenCV Camera」のサンプルを修正しました。また、例としてHough Line Transformを使用しています。ただし、ポイントに対して奇妙な数字(少なくとも私が信じているものは奇妙な数字)を取得しています。b の範囲は 1000 から -1000 です。

コードを完全には理解していません (ほとんどの場合、1000 * (a または -b) の加算/減算に関する部分)。

結局、線はまったく見えません。

誰か手を貸してくれませんか?また、さらに情報が必要な場合はお知らせください。

capture.retrieve(mGray, Highgui.CV_CAP_ANDROID_GREY_FRAME);
Imgproc.Canny(mGray, mIntermediateMat, 80, 100);
Imgproc.HoughLines(mIntermediateMat, mLines, 1, Math.PI/180, 100);

Scalar color = new Scalar(0, 0, 255);

double[] data;
double rho, theta;
Point pt1 = new Point();
Point pt2 = new Point();
double a, b;
double x0, y0;
for (int i = 0; i < mLines.cols(); i++)
{
    data = mLines.get(0, i);
    rho = data[0];
    theta = data[1];
    a = Math.cos(theta);
    b = Math.sin(theta);
    x0 = a*rho;
    y0 = b*rho;
    pt1.x = Math.round(x0 + 1000*(-b));
    pt1.y = Math.round(y0 + 1000*a);
    pt2.x = Math.round(x0 - 1000*(-b));
    pt2.y = Math.round(y0 - 1000 *a);
    Core.line(mIntermediateMat, pt1, pt2, color, 3);
}

Imgproc.cvtColor(mIntermediateMat, mRgba, Imgproc.COLOR_GRAY2BGRA, 4);

Bitmap bmp = Bitmap.createBitmap(mRgba.cols(), mRgba.rows(), Bitmap.Config.ARGB_8888);

if (Utils.matToBitmap(mRgba, bmp))
    return bmp;

bmp.recycle();
return null;
4

3 に答える 3

35

HoughLinePを使用して、フレーム内の線を見つけて引き戻しています。

これが私のコードです...これが役に立てば幸いです。

    Mat mYuv = new Mat();
    Mat mRgba = new Mat();
    Mat thresholdImage = new Mat(getFrameHeight() + getFrameHeight() / 2, getFrameWidth(), CvType.CV_8UC1);
    mYuv.put(0, 0, data);
    Imgproc.cvtColor(mYuv, mRgba, Imgproc.COLOR_YUV420sp2RGB, 4);
    Imgproc.cvtColor(mRgba, thresholdImage, Imgproc.COLOR_RGB2GRAY, 4);
    Imgproc.Canny(thresholdImage, thresholdImage, 80, 100, 3);
    Mat lines = new Mat();
    int threshold = 50;
    int minLineSize = 20;
    int lineGap = 20;

    Imgproc.HoughLinesP(thresholdImage, lines, 1, Math.PI/180, threshold, minLineSize, lineGap);

    for (int x = 0; x < lines.cols(); x++) 
    {
          double[] vec = lines.get(0, x);
          double x1 = vec[0], 
                 y1 = vec[1],
                 x2 = vec[2],
                 y2 = vec[3];
          Point start = new Point(x1, y1);
          Point end = new Point(x2, y2);

          Core.line(mRgba, start, end, new Scalar(255,0,0), 3);

    }

    Bitmap bmp = Bitmap.createBitmap(getFrameWidth(), getFrameHeight(), Bitmap.Config.ARGB_8888);

    if (Utils.matToBitmap(mRgba, bmp))
         return bmp;
于 2011-11-02T02:52:27.127 に答える
1

画像に線を引きますが、mIntermediateMat画像を返しmRgbaます。線が見えないのはそのためです。

-1000..1000 の範囲 bは正しいです。HoughLines線の角度とゼロからの距離 (別名rhotheta ) を返します。それらを描画するには、それらを 2 点に変換する必要があります。1000 は画像の寸法です。2000x2000 の画像を描画する場合は、2000 に増やします。そうしないと、線が画像全体を横切らなくなります。

HoughLinesとは異なるアルゴリズムですHoughLinesPHoughLines画像全体を横切る線のみを検索します。HoughLinesP短い線分を返します。

于 2015-07-06T09:06:29.090 に答える