Рисование ограничивающего прямоугольника с использованием OpenCV в среде C ++

Здравствуйте, я разработал программное обеспечение, которое рисует контуры входного изображения, теперь я хочу перейти на следующий уровень и нарисовать Bounding Box вокруг объектов, представляющих интерес, то есть человека. Я посмотрел на функцию boundingRect (), но я пытаюсь понять это. Может быть, есть разные алгоритмы функций рисования Bounding Box …..?

Вот код моей программы:

     #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 функция:

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) );
1

Другие решения

Я говорил о технике ограничительной рамки в этих постах:

Я думаю, что последнее может помочь вам понять, как работает стандартная техника. То, что предлагает OpenCV, является более простым подходом.

1

это ссылка не помогла?

Я думаю, что это демонстрирует, как взять объект контура и сделать его приближением многоугольника, плюс как нарисовать ограничивающий прямоугольник вокруг него.

Кажется, это одна из основных демонстраций OpenCV.

0