Node.js 如何在opencv4nodejs中将JSON描述符转换为cv.Mat格式?
我试图使用opencv4nodejs,在match功能函数中使用JSON文件中存储的数据。存储的数据是来自先前计算的图像的描述符。当计算数据并在代码中使用时,一切正常,但从JSON文件中获取数据时则不然。 数据类型为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 方法。
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;