OpenCV不能在CascadeClassifier上设置setImage以与runAt一起使用

时间:2014-11-11 20:32:20

标签: c++ opencv

使用OpenCV,我需要使用CascadeClassifier的runAt方法来扫描图像的特定部分。

根据文档,我需要setImage才能使用此方法。

经过一些研究,我发现了一些其他问题,建议您需要创建一个继承CascadeClassifier的类,以便使用setImage和runAt方法,因为它们受到保护。

尝试此操作后,当我调用setImage时出现分段错误,我似乎无法找到正确的方法来执行此操作。

detect_multi方法调用内置的detectMultiScale来检测正确的面数,因此我知道基本类正在工作。但是,为了使用runAt,我尝试使用setImage的每一种方式,都会因为分段错误而崩溃。

有什么建议吗?

这是我的代码:

class MyClassifier : public cv::CascadeClassifier {
public:
    MyClassifier() {}

    void set_image(cv::Mat &image) {
        setImage(image);
    }

    void load_classifier(std::string file) {
        load(file);
    }

    void detect_multi(cv::Mat &image) {
        std::vector<cv::Rect> faces;
        detectMultiScale(image, faces, 1.1, 2, 0| CV_HAAR_SCALE_IMAGE, cv::Size(30,30));
        printf("Number detected: %zu\n", faces.size());
    }
};


int main() {
    cv::Mat image = cv::imread("GT.jpg", CV_8UC1);
    MyClassifier face_cascade;
    face_cascade.load_classifier("haarcascade_frontalface_default.xml");
    face_cascade.detect_multi(image);
    face_cascade.setImage(image);
    return 0;
}

1 个答案:

答案 0 :(得分:0)

也许最好在单独的ROI上应用detectMultiScale而不是你的子类化方法:

CascadeClassifier face_cascade(...);
Mat image = ...
Mat roi1 = image( Rect(20,20, 40,40 ) );
face_cascade.detect_multi( roi1, ... );

Mat roi2 = image( Rect(172,40, 40,40 ) );
face_cascade.detect_multi( roi2, ... );