### 在React.js中正确加载XML文件的方法是什么?

我正在为大学开发一个MERN Stack项目,用户可以上传汽车照片,我希望使用OpenCV来模糊车牌,因此我需要使用一个“haarcascades”文件来识别区域。以下是相关代码:

  const handlePhotosChange = async (e) => {    const { files } = e.target;    const selectedPhotos = Array.from(files);    for (const photo of selectedPhotos) {      const img = new Image();      img.src = URL.createObjectURL(photo);      await new Promise((resolve) => {        img.onload = () => {          resolve();        };      });      const mat = cv.imread(img);      const gray = new cv.Mat();      cv.cvtColor(mat, gray, cv.COLOR_RGBA2GRAY);      const licensePlateCascade = new cv.CascadeClassifier();      const cascadeLoaded = licensePlateCascade.load(        "haarcascade_license_plate_rus_16stages.xml"      );      console.log("1");      if (cascadeLoaded) {        console.log("2");        const plates = new cv.RectVector();        const minSize = new cv.Size(30, 30);        licensePlateCascade.detectMultiScale(gray, plates, 1.1, 3, 0, minSize);        for (let i = 0; i < plates.size(); i++) {          const plate = plates.get(i);          const plateMat = gray.roi(plate);          cv.GaussianBlur(plateMat, plateMat, new cv.Size(5, 5), 0);          plateMat.delete();        }        const blurredImg = new Image();        blurredImg.src = URL.createObjectURL(          new Blob([cv.imencode(".jpg", mat)], { type: "image/jpeg" })        );        const blurredBlob = await fetch(blurredImg.src).then((res) =>          res.blob()        );        selectedPhotos[selectedPhotos.indexOf(photo)] = blurredBlob;        plates.delete();      }      mat.delete();      gray.delete();      licensePlateCascade.delete();    }    setPhotos(selectedPhotos);  };

我特别在这一行遇到了问题:

      const cascadeLoaded = licensePlateCascade.load(        "haarcascade_license_plate_rus_16stages.xml"      );

代码执行的瞬间,控制台出现了以下错误:

[ERROR:[email protected]] global persistence.cpp:531 open Can’t open file: ‘haarcascade_license_plate_rus_16stages.xml’ in read mode

我尝试过使用完整路径,使用GitHub的原始链接,将文件放入public目录,以及将代码和文件放入后端,但都没有成功。

预期行为:文件无错误地加载。


回答:

感谢@Christoph Rackwitz的评论,我找到了解决方案

你需要做的:

1- 从OpenCV的GitHub仓库获取utils.js

2- 为了使其正常工作,你需要在其中添加这一行(使用你使用的opencv.js的相对路径)

import * as cv from "../opencv/opencv";

3- 将其导入到你想要使用haarcascade的组件中。

import Utils from "../assets/utils";

同时,确保也导入了opencv.js。

4- 接下来,你需要将你选择的haarcascade文件放入/public目录中。

5- 将其赋值给一个变量:

const xmlURL = "haarcascade_xxxx_license_plate.xml";

6- 最后,我们将使用utils.js中的createFileFromUrl()来加载我们的haarcascade文件:

utils.createFileFromUrl(xmlURL, xmlURL, () => {     licensePlateCascade.load(xmlURL);

为了方便起见,这里是完整的函数:

  const handleLicensePlateDetection = async (e) => {try {  console.log("Starting license plate detection...");  // Clean up previous resources if necessary  if (window.src) window.src.delete();  if (window.gray) window.gray.delete();  if (window.plates) window.plates.delete();  if (window.licensePlateCascade) window.licensePlateCascade.delete();  const file = e.target.files[0];  const reader = new FileReader();  reader.onload = async () => {    console.log("Image loaded successfully.");    const image = new Image();    image.src = reader.result;    image.onload = async () => {      console.log("Converting image to grayscale...");      const src = cv.imread(image);      const gray = new cv.Mat();      cv.cvtColor(src, gray, cv.COLOR_RGBA2GRAY, 0);      console.log("Loading Haar Cascade XML file...");      const licensePlateCascade = new cv.CascadeClassifier();      const xmlURL = "haarcascade_xxx_license_plate.xml"; // Path to the XML file      utils.createFileFromUrl(xmlURL, xmlURL, () => {        try {          licensePlateCascade.load(xmlURL);          console.log("Haar Cascade XML file loaded successfully.");          console.log("Detecting license plates...");          const plates = new cv.RectVector();          const msize = new cv.Size(0, 0);          licensePlateCascade.detectMultiScale(            gray,            plates,            1.1,            3,            0,            msize,            msize          );          console.log("Applying Gaussian blur to detected plates...");          for (let i = 0; i < plates.size(); ++i) {            try {              const plate = plates.get(i);              const roi = src.roi(plate);              cv.GaussianBlur(                roi,                roi,                new cv.Size(23, 23),                40,                40,                cv.BORDER_DEFAULT              );              roi.delete();            } catch (error) {              console.error(                "Error applying Gaussian blur to plate:",                error              );            }          }          console.log("Displaying the result...");          cv.imshow("canvas", src);          // Clean up          src.delete();          gray.delete();          plates.delete();          licensePlateCascade.delete();        } catch (error) {          console.error("Error loading Haar Cascade XML file:", error);        }      });    };  };  reader.readAsDataURL(file);} catch (error) {  console.error("Error initializing license plate detection:", error);}  };

注意:我对“AI”这类东西还不太熟悉,需要AI的帮助,因此我对刚刚粘贴的内容大部分都不理解

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注