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

问题描述 投票:0回答:1

我已经训练了Haar级联,现在我需要处理已建立的对象。我如何从原始图像中裁剪并在新窗口中显示?(如果在图像上发现2个对象,则显示多个窗口)。这是我的代码(opencv版本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;}
c++ opencv computer-vision haar-classifier
1个回答
0
投票

您的trafficLights vector正在保存找到的对象的每个矩形的数据。您只需要获取每个矩形的left&top坐标,宽度和高度,并且已经有了它们。您所需要的是通过创建每个矩形的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);
    }
© www.soinside.com 2019 - 2024. All rights reserved.