opencv的某些功能在某些特定情况下显示错误

时间:2014-05-27 08:04:28

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

我正在使用带有android的opencv,因为我首先在visual studio上使用opencv尝试我的代码,它可以很好地工作,但有些东西让我在理解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);

错误&#39; S

当我使用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 &, const cv::_InputArray &, const cv::_OutputArray&, 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);

乘法函数显示我上面提到的错误,但是当我使用它时:

    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);

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

我正在使用eclipse与opencv android版本2.4.8进行原生环境。

2 个答案:

答案 0 :(得分: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。我认为你正在做同样的事情。

答案 1 :(得分: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);

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