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

Posted

技术标签:

【中文标题】将节点数组(可变长度)转换为 const float** 以调用 opencv.calcHist【英文标题】:Convert Node Array (variable lenght) to a const float** to call opencv.calcHist 【发布时间】:2017-08-24 18:48:20 【问题描述】:

上下文

我目前正在处理https://github.com/piercus/node-opencv(来自https://github.com/peterbraden/node-opencv),我正在为 calcHist 函数实现一个活页夹。

问题

C++ 函数将const float** ranges 作为输入 (见http://docs.opencv.org/2.4/modules/imgproc/doc/histograms.html#calchist) 考虑到我想设置输入的大小 我不知道如何在不破坏编译器的情况下有条件地设置这个const float** 的大小

解决方法

考虑到最大维数是 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)。

【问题讨论】:

【参考方案1】:

您不需要复制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);

【讨论】:

以上是关于将节点数组(可变长度)转换为 const float** 以调用 opencv.calcHist的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 Rust 中将 const 引用直接转换为可变引用无效?

Java开发知识体系!java动态数组长度可变

如何让编译时 const 对象配置有一块可变长度的数据?

将 Swift 字符串数组转换为 const char * const *

如何将可变长度列表的 Pandas DataFrame 列(或系列)转换为固定宽度的 DataFrame [重复]

转换为常量类型,初始化数组