c++ - 将节点数组(可变长度)转换为 const float** 以调用 opencv.calcHist

标签 c++ opencv pointers constants node.js-addon

上下文

我目前正在研究 https://github.com/piercus/node-opencv (从 https://github.com/peterbraden/node-opencv fork ),我正在为 calcHist 函数实现一个 Binder 。

问题

解决方法

考虑到最大维度数为 3,我制定了一个解决方法(参见 full source )

// Wrap Javascript input which is like [[0, 256], [0, 256]]
Local<Array> nodeRanges = Local<Array>::Cast(info[3]->ToObject());

// create a first table
float histRanges[dims][2];

for (unsigned int i = 0; i < dims; i++) {
  Local<Array> nodeRange = Local<Array>::Cast(nodeRanges->Get(i)->ToObject());
  float lower = nodeRange->Get(0)->NumberValue();
  float higher = nodeRange->Get(1)->NumberValue();
  histRanges[i][0] = lower;
  histRanges[i][1] = higher;
}

// minimum length is 1 so i can fullfill first range without issue
float first_range[] = { histRanges[0][0], histRanges[0][1] };
float second_range[] = { 0, 0}; // here is my problem, do i really need to do this
float third_range[] = { 0, 0};// same problem here

if(dims >= 2){
  second_range[0] = histRanges[1][0];
  second_range[1] = histRanges[1][1];
}
if(dims >= 3){
  third_range[0] = histRanges[2][0];
  third_range[1] = histRanges[2][1];
}

// now i can create a const float** compatible type 
const float* histRanges1[] = {first_range, second_range, third_range};

[... other stuffs ...]

// const float** is needed here
cv::calcHist(&inputImage, 1, channels, cv::Mat(), outputHist, dims, histSize, histRanges1, uniform);

问题

是否可以在不创建“零填充”对象的情况下以优雅的方式进行操作? 我希望输入的最大大小为 32(而不是 3)。

最佳答案

您不需要复制 histRanges 的内容,因为其中的数字已经布局为 float 数组,就像 cv::calcHist 要求。您只需要创建一个指向这些数组的指针数组。

float histRanges[dims][2];
const float* ranges[dims];

for (unsigned int i = 0; i < dims; i++) {
  Local<Array> nodeRange = Local<Array>::Cast(nodeRanges->Get(i)->ToObject());
  float lower = nodeRange->Get(0)->NumberValue();
  float higher = nodeRange->Get(1)->NumberValue();
  histRanges[i][0] = lower;
  histRanges[i][1] = higher;
  ranges[i] = histRanges[i];
}

cv::calcHist(&inputImage, 1, channels, cv::Mat(), outputHist, dims, histSize, ranges, uniform);

关于c++ - 将节点数组(可变长度)转换为 const float** 以调用 opencv.calcHist,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45868943/

相关文章:

c++ - libiconv - iconv_open() 默认行为?

c++ - 动态分配数组的有趣行为

c++ - 在 C++ 中立即读取由空格分隔的输入字符串和整数

C++ ifstream 长完整路径不起作用

image-processing - 如何将 x,y 像素映射到世界坐标

python - 使用 python-openCv 进行简单模板匹配

c - 通过多个函数按引用传递

java - 如何使用 opencv 作为依赖项正确构建 javaFX 应用程序?

c++ - 为什么指向 NULL 字符的指针未转换为 false

c++ - 无法通过函数传递 vector 中的 ifstream 指针