0

こんにちは、OpenCV を使用して長方形/正方形を検出する Android アプリを作成しています。それらを検出するために、squares.cpp の関数 (少し変更) を使用しています。見つかったすべての正方形のポイントを vector> squares に格納し、それを関数に渡して最大のものを選択し、ベクトル theBiggestSq に格納します。問題は、コードを以下に貼り付けるトリミング機能にあります(問題を示すYouTubeへのリンクも投稿します)。実際の正方形がカメラから十分に離れている場合は問題なく動作しますが、ある時点で少し閉じるとハングします。問題の印刷画面を LogCat から投稿します。印刷されたポイントがあります (BiggestSq ベクトルから取得した境界ポイント。解決策を見つけるのに役立つ可能性があります)。

void cutAndSave(vector<Point> theBiggestSq, Mat image){
    RotatedRect box = minAreaRect(Mat(theBiggestSq));
    // Draw bounding box in the original image (debug purposes)
    //cv::Point2f vertices[4];
    //box.points(vertices);
    //for (int i = 0; i < 4; ++i)
    //{
    //cv::line(img, vertices[i], vertices[(i + 1) % 4], cv::Scalar(0, 255, 0), 1, CV_AA);
    //}
    //cv::imshow("box", img);
    //cv::imwrite("box.png", img);
    // Set Region of Interest to the area defined by the box
    Rect roi;
    roi.x = box.center.x - (box.size.width / 2);
    roi.y = box.center.y - (box.size.height / 2);
    roi.width = box.size.width;
    roi.height = box.size.height;
    // Crop the original image to the defined ROI

    //bmp=Bitmap.createBitmap(box.size.width / 2, box.size.height / 2, Bitmap.Config.ARGB_8888);
    Mat crop = image(roi);
    //Mat crop = image(Rect(roi.x, roi.y, roi.width, roi.height)).clone();
    //Utils.matToBitmap(crop*.clone()* ,bmp);
    imwrite("/sdcard/OpenCVTest/1.png", bmp);
    imshow("crop", crop);

}

私のアプリとその問題のビデオ

ここに画像の説明を入力

それぞれに印刷されるコードは: roi.x roi.y roi.width roi.height

もう 1 つの問題は、描画された境界が緑色であるべきなのに、ビデオでわかるように歪んでいることです (これらの境界がガラスでできているように曲がっていますか?)。

助けてくれてありがとう。私はopenCVで1か月しかやっていないので、寛大にしてください。

編集: 描画コード:

//draw//
    for( size_t i = 0; i < squares.size(); i++ )
    {
        const Point* p = &squares[i][0];
        int n = (int)squares[i].size();
        polylines(mBgra, &p, &n, 1, true, Scalar(255,255,0), 5, 10);
        //Rect rect = boundingRect(cv::Mat(squares[i]));
        //rectangle(mBgra, rect.tl(), rect.br(), cv::Scalar(0,255,0), 2, 8, 0);

    }
4

1 に答える 1

2

このエラーは基本的に原因を示しています - ROI が画像のサイズを超えています。これは、 x または yRect roiRotatedRect boxいずれかが 0 より小さいか、幅/高さがイメージの外側に寸法を押し出すことを意味します。次のようなものを使用してこれを確認する必要があります

// Propose rectangle from data
int proposedX = box.center.x - (box.size.width / 2);
int proposedY = box.center.y - (box.size.height / 2);
int proposedW = box.size.width;
int proposedH = box.size.height;

// Ensure top-left edge is within image
roi.x = proposedX < 0 ? 0 : proposedX;
roi.y = proposedY < 0 ? 0 : proposedY;

// Ensure bottom-right edge is within image
roi.width = 
   (roi.x - 1 + proposedW) > image.cols ? // Will this roi exceed image?
   (image.cols - 1 - roi.x)               // YES: make roi go to image edge
   : proposedW;                           // NO: continue as proposed
// Similar for height
roi.height = (roi.y - 1 + proposedH) > image.rows ? (image.rows - 1 - roi.y) : proposedH;
于 2012-12-10T15:37:15.420 に答える