裁剪并显示我从 Haar Cascade 获得的图像

Crop and show image that i get from Haar Cascade

我已经训练了 Haar 级联,现在我需要使用 founded 对象。我如何从原始图像中裁剪它并在新的 window 中显示?(如果我在图像上找到 2 个对象,则显示多个 window)。这是我的代码(opencv ver 2.4.13):

    #include <opencv2/opencv.hpp>
#include <iostream>
#include <fstream>
using namespace std;
using namespace cv;

int main(void)
{
    CascadeClassifier trafficLightCascader;
    string Cascade_name = "TrafficLight.xml";

if (!trafficLightCascader.load(Cascade_name))
{
    cout << "Can't load the face feature data" << endl;
    return -1;
}

vector<Rect> trafficLights;

Mat src = imread("6копия.png"); 
CvRect AssignRect = Rect(0, 0, src.cols, src.rows / 2);
Mat srcImage = src(AssignRect);

Mat grayImage(srcImage.rows, srcImage.cols, CV_8UC1);

cvtColor(srcImage, grayImage, CV_BGR2GRAY);
equalizeHist(grayImage, grayImage); 

trafficLightCascader.detectMultiScale(grayImage, trafficLights, 1.1, 1, 0, Size(3,3));

for (int i = 0; i < trafficLights.size(); ++i)
{
    rectangle(src, trafficLights[i], Scalar(0, 255, 0), 2, 8, 0);
}

imshow("src", src);
waitKey(0);


return 0;}

您的 trafficLights vector 保存着每个矩形的已找到对象的数据。您只需要获取每个矩形的 左和上坐标、宽度和高度 ,您已经有了它们。您所需要的只是通过创建它们的 Mat 格式并在不同的框架中显示来裁剪每个矩形。

您可以查看 here 以了解有关裁剪的更多信息。

这是您需要的代码:

for (int i = 0; i < trafficLights.size(); ++i)
    {   
        Rect crop_found(trafficLights[i].x,trafficLights[i].y, trafficLights[i].width, trafficLights[i].height);

        Mat found(src, crop_found);

        imshow(to_string(i),found);

        rectangle(src, trafficLights[i], Scalar(0, 255, 0), 2, 8, 0);
    }