【问题标题】:OpenCV Can't setImage on CascadeClassifier for use with runAtOpenCV 无法在 CascadeClassifier 上设置图像以与 runAt 一起使用
【发布时间】:2015-01-08 12:56:58
【问题描述】:

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

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

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

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

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

有什么建议吗?

这是我的代码:

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;
}

【问题讨论】:

    标签: c++ opencv


    【解决方案1】:

    也许将 detectMultiScale 应用于单独的 ROI 而不是子类化方法是一个更好的主意:

    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, ... );
    

    【讨论】:

    • 我希望使用 runAt 方法,因为我必须进行一些并行化。我认为以这种方式使用 multiDetect 会产生太多开销,但如果我无法解决我的 setImage 和 runAt 问题,我会看看它。
    猜你喜欢
    • 2012-12-11
    • 2020-05-27
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 2021-12-14
    • 2018-03-12
    • 1970-01-01
    相关资源
    最近更新 更多