使用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;
}
答案 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, ... );