我正在使用带有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进行原生环境。
答案 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);
我想这不是一个完整的答案,但也许它有助于解决问题。处理多个通道时,此方法适用于我,但可能比代码慢。