我正在使用 opencv 做我的第一个 Web 应用程序,这个 OpenCV 人脸检测教程指导我加载
haarcascade_frontalface_default.xml
然后检测照片中的人脸,示例代码如下:
let faceCascade = new cv.CascadeClassifier();
faceCascade.load('haarcascade_frontalface_default.xml'); //<--return false
由于加载失败,我无法使用
detectMultiScale
功能,错误日志是:
Assertion failed (!empty()) in detectMultiScale, file /build/master-contrib_docs-lin64/opencv/modules/objdetect/src/cascadedetect.cpp, line 1698
我的 haarcascade 文件是否放置在错误的位置?还是
load()
中的参数错误?
好的,所以您需要通过将文件读入 opencv 文件系统来使 cv 可以访问该文件。为此,您需要使用 XMLHttpRequest() 获取 URL,然后调用 cv.CascadeClassifier,如下所示:
const xml_model_url = 'https://raw.githubusercontent.com/opencv/opencv/master/data/haarcascades/haarcascade_frontalface_default.xml';
const xml_path = "haarcascade_frontalface_default.xml";
let faceCascade = null;
function createFileFromUrl(path, url, callback) {
// path: string to access loaded file trough cv
// url: path of the actual file on your FS
// callback: what to do when file is loaded
let request = new XMLHttpRequest();
request.open('GET', url, true);
request.responseType = 'arraybuffer';
request.onload = function(ev) {
request = this;
if (request.readyState === 4) {
if (request.status === 200) {
let data = new Uint8Array(request.response);
cv.FS_createDataFile('/', path, data, true, false, false);
callback();
} else {
console.error('Failed to load ' + url + ' status: ' + request.status);
}
}
};
request.send();
}
function createCascade() {
faceCascade = new cv.CascadeClassifier(xml_path);
}
createFileFromUrl(xml_path, xml_model_url,createCascade);