【问题标题】:Crop and show image that i get from Haar Cascade裁剪并显示我从 Haar Cascade 获得的图像
【发布时间】:2020-09-23 23:40:41
【问题描述】:

我已经训练了 Haar 级联,现在我需要使用已创建的对象。我如何从原始图像中裁剪它并在新窗口中显示?(如果我在图像上找到 2 个对象,则显示多个窗口)。有我的代码(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;}

【问题讨论】:

    标签: c++ opencv computer-vision haar-classifier


    【解决方案1】:

    您的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);
        }
    

    【讨论】:

      猜你喜欢
      • 2020-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多