Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何在opencv4nodejs中将JSON描述符转换为cv.Mat格式?_Node.js_Json_Opencv_Opencv4nodejs - Fatal编程技术网

Node.js 如何在opencv4nodejs中将JSON描述符转换为cv.Mat格式?

Node.js 如何在opencv4nodejs中将JSON描述符转换为cv.Mat格式?,node.js,json,opencv,opencv4nodejs,Node.js,Json,Opencv,Opencv4nodejs,我试图使用opencv4nodejs,在match功能函数中使用JSON文件中存储的数据。存储的数据是来自先前计算的图像的描述符。当计算数据并在代码中使用时,一切正常,但从JSON文件中获取数据时则不然。 数据类型为cv.Mat,然后使用fs.writeFileSync()方法存储在JSON文件中。问题是,使用这些描述符的下一个函数需要一个cv.Mat类型的变量,JSON数据不被视为这样。如何使用JSON文件中存储的这些数据 此过程在C++中完美无误,使用 CV::FIRTSRTRAGE 方法。

我试图使用opencv4nodejs,在match功能函数中使用JSON文件中存储的数据。存储的数据是来自先前计算的图像的描述符。当计算数据并在代码中使用时,一切正常,但从JSON文件中获取数据时则不然。 数据类型为
cv.Mat
,然后使用
fs.writeFileSync()
方法存储在JSON文件中。问题是,使用这些描述符的下一个函数需要一个
cv.Mat
类型的变量,JSON数据不被视为这样。如何使用JSON文件中存储的这些数据

此过程在C++中完美无误,使用<代码> CV::FIRTSRTRAGE 方法。JSON文件如下所示:

{
    "first": {
        "type_id": "opencv-matrix",
        "rows": 69,
        "cols": 128,
        "dt": "f",
        "data": [ 2.76096805e-04, 7.95492728e-04, 4.21693228e-04, (...)
},
    "second": {
        "type_id": "opencv-matrix",
        "rows": 45,
        "cols": 128,
        "dt": "f",
        "data": [ 3.94702045e-04, 1.63780281e-03, -2.23156996e-03, (...)
    }
}
JSON文件显示存储的数据,可以使用
运算符存储
cv::Mat
变量

我无法使用opencv4nodejs版本5.5.0在node.js中重现此过程。 我使用
cv.Mat
变量上的
JSON.stringify()
方法保存JSON文件,然后使用
fs
包中的
fs.writeFileSync()
方法存储描述符(不幸的是,在opencv4nodejs中似乎没有与
cv::FileStorage
等效的方法)。 首先,我无法在创建的JSON文件中看到任何数据:

{"first":{"step":512,"elemSize":4,"sizes":[69,128],"empty":0,"depth":5,"dims":2,"channels":1,"type":5,"cols":128,"rows":69},
"second":{"step":512,"elemSize":4,"sizes":[45,128],"empty":0,"depth":5,"dims":2,"channels":1,"type":5,"cols":128,"rows":45}}
我试图通过
first.size
方法访问
size
元素,但它只返回数组的大小,而不返回数组中的数据。我徒劳地搜索了一种访问JSON文件中不可见数据的方法。这方面的一些光会很好。 更重要的是,我不能在下一个函数中使用这些描述符,因为它需要
cv.Mat
类型

MSERDetector::MatchKnn - Error: expected argument 0 to be of type Mat
我探索了两种解决方案,但迄今为止没有成功:

  • 格式化JSON文件。我试图创建一个JSON数组,但没有效果:
我还尝试添加一个名为
mat
的键(我知道这是一个愚蠢的键,不知道如何格式化JSON文件,因为我在网上找不到任何文档):

  • 将JSON数据转换为
    cv.Mat
    。我首先使用
    fs.readFileSync()
    读取文件,然后使用
    JSON.parse()
    方法解析文件。尝试使用
    new cv.Mat()
    转换此变量时,它返回一个空矩阵。我还尝试手动填充它:
这一次,它返回一个
cv.Mat
变量,显示完全相同的{keys:values},就好像它刚刚被计算过一样,但给出了错误的结果。它的行为就像里面根本没有存储任何数据一样

也许我的问题可以更精确一些:有没有一种方法可以表明JSON文件的类型是
cv.Mat
,如果有,如何在opencv4nodejs中这样做?我们看到,
cv::FileStorage
在创建文件时指定了一个类型,
“type\u id”:“opencv matrix”
。但是我找不到opencv4nodejs的任何文档或示例。第二个问题是,如何将JSON数据转换为
cv.Mat
,使其实际使用假定存储在JSON文件中的数据填充几乎创建的变量?问题可能是该文件不包含任何数据,因为我没有发现任何可能看到它们的可能性。奇怪的是,我甚至无法使用
console.log()
查看数据。在描述符
cv.Mat
变量上,它显示:

Mat {
  step: 512,
  elemSize: 4,
  sizes: [ 69, 128 ],
  empty: 0,
  depth: 5,
  dims: 2,
  channels: 1,
  type: 5,
  cols: 128,
  rows: 69
}
在解析的JSON文件上:

{
  first: {
    step: 512,
    elemSize: 4,
    sizes: [ 69, 128 ],
    empty: 0,
    depth: 5,
    dims: 2,
    channels: 1,
    type: 5,
    cols: 128,
    rows: 69
  }
}

欢迎提供任何帮助,无论如何,感谢您阅读我的问题。

好的,我写这篇文章是为了回答您的问题,因为评论太长了。这就是打开
YAML
文件并将其数据存储在OpenCV矩阵中的方式。YAML文件中的数据根据“标签”存储。我们可以在一个文件中使用多个标签定义多个矩阵

例如,包含矩阵数据的文件可能如下所示:

myInputFile.yml:

myMatrix: !!opencv-matrix
   rows: 2
   cols: 2
   dt: f
   data: [ 5.8485,  12.6626,
           6.6515,  11.0982 ]
该文件定义了一个2 x 2矩阵。数据类型由
dt
标签定义,在本例中为
f
loat。检索此数据的方法是请求
myMatrix
标签,并使用空矩阵作为接收器。我不知道OpenCV的java语法;在C++中,你是这样做的:

//let's read the external YAML file:
std::string fileStoragePath = "myInputFile.yml";

//use OpenCv's file system to open the file:
cv::FileStorage inputFile( fileStoragePath, cv::FileStorage::READ );

//let's check if the file can be actually opened…
if ( !inputFile.isOpened() ){
   std::cout << "Encountered an error while opening the file!" <<std::endl;
}

//parse the data in the input file to a matrix:
cv::Mat dataMatrix;

//Now, give me a label, and I will give you the data of that label:
std::string fieldName = "myMatrix";
inputFile [ fieldName ] >> dataMatrix;
//让我们阅读外部YAML文件:
std::string fileStoragePath=“myInputFile.yml”;
//使用OpenCv的文件系统打开文件:
cv::FileStorage inputFile(fileStoragePath,cv::FileStorage::READ);
//让我们检查文件是否可以实际打开…
如果(!inputFile.isOpened()){

std::cout将您的输出放入一个变量并作为字典访问。例如,
output={“first”:{“step”:512,“elemSize”:4,“size”:[69128],“empty”:0,“depth”:5,“dims”:2,“channels”:1,“type”:5,“cols”:128,“rows”:69},“second”:{“step”:512,“elemSize”:4,“size”:[45128],“empty”:0,“depth”:5,“dims”:2,“channels”:1,“type”:5,“cols”:128,“rows”:45}
对于
输出[“first”][“size”],您将获得一些
[69128]
。您可以使用OpenCV的文件系统以YAML格式本地存储和检索OpenCV浮点矩阵中的浮点数据,完全不需要外部JSON解析器。如果可能的话,我建议采用前一种方法,因为它更简单、更快!谢谢@testuser。事实上,console.log(output[“first”][“size”])返回[69128]。但我仍然无法访问任何数据,也无法使用此输出,因为它未被识别为
cv.Mat
类型。谢谢@eldesgraciado。我为node.js安装了
js yaml
模块。我使用
yaml.load(fs.writeflesync(“./uploads/descriptors.yml”,descriptors\u first))创建了yml文件;
。这一次,该文件只包含
[object Mat]
,仍然无法使用,因为它未被识别为
cv.Mat
类型。正如我在最初的问题中提到的,这对
cv.FileStorage()非常有效
。数据显示在文件中,并且可以轻松检索。我的问题是它在node.js中不起作用。Data do
{
  first: {
    step: 512,
    elemSize: 4,
    sizes: [ 69, 128 ],
    empty: 0,
    depth: 5,
    dims: 2,
    channels: 1,
    type: 5,
    cols: 128,
    rows: 69
  }
}
myInputFile.yml:

myMatrix: !!opencv-matrix
   rows: 2
   cols: 2
   dt: f
   data: [ 5.8485,  12.6626,
           6.6515,  11.0982 ]
//let's read the external YAML file:
std::string fileStoragePath = "myInputFile.yml";

//use OpenCv's file system to open the file:
cv::FileStorage inputFile( fileStoragePath, cv::FileStorage::READ );

//let's check if the file can be actually opened…
if ( !inputFile.isOpened() ){
   std::cout << "Encountered an error while opening the file!" <<std::endl;
}

//parse the data in the input file to a matrix:
cv::Mat dataMatrix;

//Now, give me a label, and I will give you the data of that label:
std::string fieldName = "myMatrix";
inputFile [ fieldName ] >> dataMatrix;