Используя 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;
}
может быть, это лучшая идея применить 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, ... );