1

こんにちはのぞき見入力画像の輪郭を描画するソフトウェアを開発しました。これを次のレベルに進めて、関心のあるオブジェクト、つまり人物の周りにバウンディング ボックスを描画するつもりはありません。boundingRect() 関数を見ましたが、理解するのに苦労しています。たぶん、バウンディング ボックスを描画するさまざまな関数のアルゴリズムがあります.....?

これが私のプログラムのコードです:

     #include "iostream"
    #include<opencv\cv.h>
    #include<opencv\highgui.h>
    #include<opencv\ml.h>
    #include<opencv\cxcore.h>
    #include <iostream> 
    #include <string> 
    #include <opencv2/core/core.hpp> // Basic OpenCV structures (cv::Mat)
    #include <opencv2/highgui/highgui.hpp> // Video write

using namespace cv;
using namespace std;

Mat image; Mat image_gray; Mat image_gray2; Mat threshold_output;
int thresh=100, max_thresh=255;


int main(int argc, char** argv) {

    //Load Image
    image =imread("C:/Users/Tomazi/Pictures/Opencv/tomazi.bmp");

    //Convert Image to gray & blur it
    cvtColor( image, 
        image_gray, 
        CV_BGR2GRAY );

    blur( image_gray, 
        image_gray2,
        Size(3,3) );
    //Threshold Gray&Blur Image
    threshold(image_gray2, 
        threshold_output, 
        thresh, 
        max_thresh, 
        THRESH_BINARY);

    //2D Container
    vector<vector<Point>> contours;

    //Fnd Countours Points, (Imput Image, Storage, Mode1, Mode2, Offset??)
    findContours(threshold_output,
        contours, // a vector of contours
        CV_RETR_EXTERNAL,// retrieve the external contours
        CV_CHAIN_APPROX_NONE,
        Point(0, 0)); // all pixels of each contours    

    // Draw black contours on a white image
    Mat result(threshold_output.size(),CV_8U,Scalar(255));
    drawContours(result,contours,
        -1, // draw all contours
        Scalar(0), // in black
        2); // with a thickness of 2


        //Create Window
    char* DisplayWindow = "Source";
    namedWindow(DisplayWindow, CV_WINDOW_AUTOSIZE);
    imshow(DisplayWindow, result);


    waitKey(5000);
    return 1;
}

誰でも解決策を提案できますか...?おそらく、いくつかのソース、チュートリアルなどに案内してください。OpenCVのドキュメントを読んで、boundingRect()関数を見て、まだ理解していません。助けてください :)

4

3 に答える 3

3

しかし、バウンディング ボックスを自分で簡単に計算し、rectangle関数を使用して描画することもできます。

int maxX = 0, minX = image.cols, maxY=0, minY = image.rows;

for(int i=0; i<contours.size(); i++)
    for(int j=0; j<contours[i].size(); j++)
    {
        Point p = contours[i][j];

        maxX = max(maxX, p.x);
        minX = min(minX, p.x);

        maxY = max(maxY, p.y);
        minY = min(minY, p.y);
    }

rectangle( result, Point(minX,minY), Point(maxX, maxY), Scalar(0) );
于 2013-01-25T11:10:37.583 に答える
1

このリンクは役に立ちませんでしたか?

輪郭オブジェクトを取得して多角形の近似にする方法と、その周りに境界矩形を描画する方法を示していると思います。

基本的な OpenCV デモの 1 つと思われます。

于 2013-01-25T11:33:10.983 に答える
1

バウンディング ボックスの手法については、次の投稿で説明しました。

最後のものは、標準的な手法がどのように機能するかを理解するのにおそらく役立つと思います. OpenCV が提供するのは、より簡単なアプローチです。

于 2013-01-25T12:19:13.890 に答える