【问题标题】:Some function of opencv showing error on some specific scenarioopencv 的某些功能在某些特定情况下显示错误
【发布时间】:2014-07-16 01:14:06
【问题描述】:

我正在使用带有 android 的 opencv,因为我首先在带有 opencv 的 Visual Studio 上尝试了我的代码,它在它上面运行良好,但是在理解函数和它们在 android ndk 中的错误原因方面让我感到困惑,就像在示例中一样程序

    resize(image,image,image2.size());
    image.convertTo(image,CV_32FC4,1.0/255.0);
    image2.convertTo(image2,CV_32FC4,1.0/255.0);

    vector<Mat> channel; 
    split(image,channel);

    Mat mask = image.clone();            // clone function work fine
    //Mat mask = channel[3].clone();     // clone function show me error         

  //  channel.resize(3);  // show error

    Mat it;

    multiply(mask,channel[0],channel[0]);
    multiply(mask,channel[1],channel[1]);
    multiply(mask,channel[2],channel[2]);
    merge(channel,it);

错误

当我使用Mat mask = channel[3].clone(); 时,它显示Method 'clone' could not be resolved 的错误,但是当我使用Mat mask = image.clone(); 时,它工作正常。这是为什么呢?

当我使用channel.resize(3); 时,它显示调整大小功能错误,错误是Invalid arguments 'Candidates are: void resize(?, cv::Mat)'

当我继续使用乘法函数时,它显示Invalid arguments ' Candidates are: void multiply(const cv::_InputArray &amp;, const cv::_InputArray &amp;, const cv::_OutputArray&amp;, double, int)' 的错误。

虽然这些所有功能都在使用 opencv 的 Visual Studio 中工作,并且在我使用时在不同场景中使用时它们也在 android 中工作

Mat alpha1 = ch[3];
Mat alpha =  alpha1.clone();

它在 android 中没有向我显示错误,但是当我像 Mat alpha1 = ch[3].clone(); 一样使用它时,它在 android ndk 中显示错误,上面提到了错误,multiply 在我使用时也是如此

split(image,channel);
multiply(mask,channel[0],channel[0]);
multiply(mask,channel[1],channel[1]);
multiply(mask,channel[2],channel[2]);
merge(channel,i);

multiply 函数显示我上面提到的错误,但是当我像这样使用它时:

    split(image,ch);
    vector<Mat> ch0 = ch[0];
    vector<Mat> ch1 = ch[1];
    vector<Mat> ch2 = ch[2];
    multiply(alpha, ch0, ch0);
    multiply(alpha, ch1, ch1);
    multiply(alpha, ch2, ch2);

它没有显示错误,但我不知道如何合并它们并使用它。希望我用例子来解决这个问题。

我正在使用带有 opencv android 版本 2.4.8 的 eclipse 在本地环境中工作。

【问题讨论】:

  • 提供有关错误的更多信息。什么错误?
  • 我用完整的解释更新了我的问题
  • 我无法理解您的问题。最后你说这些功能在 Visual Studio 和 Android 中都可以工作,那么你的问题在哪里?是在使用 Visual Studio 和 C++ 还是 Eclipse 和 Android 时?此外,您提供的代码在我的机器上用 VS2010 编译得很好。你能提供你得到错误的确切代码吗?
  • 我的理解是,他在使用 android ndk 而不是使用 Visual Studio 时遇到了这些功能问题
  • @AldurDisciple 一些#Rocket 的正确性,我说上面的函数在我使用opencv 的Visual Studio 中为我工作,因为我在那里测试了我的程序,但是当我在Eclipse 环境中使用Android 和ndk 时相同的程序显示错误

标签: opencv android-ndk java-native-interface computer-vision native


【解决方案1】:

你可以试试 copyTo() 而不是 clone():

vector<Mat> channel;
split(image,channel);
Mat mask;
channel[2].copyTo(mask);

您可以尝试使用 mul() 和迭代器:

for(Mat::iterator I=channel.begin();I!=channel.end();I++) {
   (*I) = (*I).mul(mask);
}
merge(channel,it);

我想这不是一个完整的答案,但也许它有助于解决问题。这种方法在处理多个通道时适用于我,但可能比您的代码慢。

【讨论】:

  • 这个方法也适用于带有 Eclipse 的 android ndk 吗?因为它仍然在循环中显示Type 'Mat::iterator' could not be resolved 和循环中的Method 'mul' could not be resolved 错误,对于 copyTo() 方法方法 'copyTo' could not be resolved
  • 好吧,这只是一个想法。我没有在安卓上测试过,抱歉。您提到的方法有一些问题,我使用上述解决方法解决了这些问题,但在 Android 上没有。
【解决方案2】:

我也有同样的问题。出于某种原因,ndk 和 jni 不适用于矢量索引。您需要创建该对象的临时实例并分配它,然后继续进行进一步处理。

我想这会解决你的问题。

split(image,ch);
Mat ch0 = ch[0];
Mat ch1 = ch[1];
Mat ch2 = ch[2];

multiply(alpha, ch0, ch0);
multiply(alpha, ch1, ch1);
multiply(alpha, ch2, ch2);

vector<Mat> newVec;
newVec.push_back(ch0);
newVec.push_back(ch1);
newVec.push_back(ch2);

merge(newVec, image);

对于调整大小和克隆,您不能在矢量索引上使用这些函数中的任何一个。您必须创建一个 Mat 的临时实例并在其上使用 cv::functions。

Mat alpha1 = ch[3];
Mat alpha =  alpha1.clone();

要调整大小,

Mat alpha1 = ch[3];
Mat alhpa1_resized;
cv::resize(alpha1, alpha1_resized, cv::Size(new_cols, new_rows));

// or
cv::resize(alpha1, alpha1_resized, cv::Size(), new_x_scale, new_y_scale);

不要增加您的 Alpha 通道。 CH[3]。保持原样并合并。你也可以试试 addWeighted。我认为你也在做同样的事情。

【讨论】:

  • 谢谢@Froyo,这是我想知道的,但它在 push_back 参数上显示错误Invalid arguments ' Candidates are: void push_back(const cv::Mat &amp;) '
  • oah 清理项目后它的工作,但它没有在我的设备上显示输出看起来它在语义上工作并且在逻辑上失败,resize.clone()
  • 你试过channel.resize(3),为什么会这样?这没有任何意义。你必须使用cv::resize 函数。
  • 是的,但我检查了你的 multiply 选项,它没有在 android ndk 上显示输出
  • 虽然它也没有显示错误,但整个过程也没有显示输出
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-20
  • 2021-01-02
相关资源
最近更新 更多