2013-01-24 61 views
0

你好,我已经开发了一个绘制输入图像轮廓的软件,现在我不想将它带到下一层,并围绕感兴趣的对象绘制边界框,即一个人。我查看了boundingRect()函数,但我很难理解它。也许有不同的函数算法绘制边界框.....?绘图在C++环境中使用OpenCV的边界框

这里是我的程序的代码:

 #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()函数,我仍然不明白。请帮助:)

+0

是你的问题如何获得边界框的参数或如何使用'rectangle'函数实际绘制它? – sietschie

+0

both:/如果你可以指导我一些简单的源代码或教程,或者如果你能在这里向我解释它,甚至更好。谢谢 – Tomazi

回答

1

但你也可以很容易地计算边框自己,然后使用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)); 
0

This链接是不是有帮助?

我认为它演示了如何获取轮廓对象并使其成为多边形逼近,以及如何在其周围绘制边界矩形。

它似乎是OpenCV的基本演示之一。