OpenCV не может установить изображение на CascadeClassifier для использования с runAt

0

Используя OpenCV, мне нужно использовать метод runAt для CascadeClassifier для сканирования определенных разделов изображения.

В соответствии с документацией мне нужно установить значениеImage, прежде чем я смогу использовать этот метод.

После некоторых исследований я нашел несколько других вопросов, предполагающих, что вам нужно создать класс, который наследует 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;
}
Теги:
opencv

1 ответ

0

может быть, это лучшая идея применить 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, ... );
  • 0
    Я надеялся использовать метод runAt, потому что мне нужно провести распараллеливание. Я полагал, что использование multiDetect таким образом создает слишком много накладных расходов, но я рассмотрю его на случай, если не смогу решить свои проблемы setImage и runAt.
  • 0
    о, чертова вещь не безопасна в любом случае.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню