opencv的某些函数在某些特定场景中显示错误

opencv的某些函数在某些特定场景中显示错误,opencv,android-ndk,java-native-interface,computer-vision,native,Opencv,Android Ndk,Java Native Interface,Computer Vision,Native,我将opencv与android一起使用,因为我首先在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);

我将opencv与android一起使用,因为我首先在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);
在android中,它不会向我显示错误,但当我像
Mat alpha1=ch[3].clone()那样使用它时它显示了android ndk中的错误,上面提到了错误,当我使用

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);
split(图像,ch);
向量ch0=ch[0];
向量ch1=ch[1];
向量ch2=ch[2];
乘法(alpha,ch0,ch0);
乘法(α,ch1,ch1);
乘法(α,ch2,ch2);
它没有向我显示错误,但我不知道如何合并它们并使用它。希望我能举例说明这个问题

我正在使用eclipse和opencv android版本2.4.8在本机环境中工作。

您可以尝试copyTo()而不是clone():


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

我也有同样的问题。由于某些原因,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 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);

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

提供有关错误的更多信息。什么错误?我用完整的解释更新了我的问题。我很难理解你的问题是什么。最后你说这些功能在VisualStudio和Android中工作,那么你的问题在哪里呢?是使用Visual Studio和C++、Eclipse和Android的时候吗?另外,您提供的代码在我使用VS2010的机器上编译得很好。你能提供你出错的确切代码吗?据我所知,他对使用android ndk而不是visual的这些函数有问题studio@AldurDiscipleRocket是对的,我在visual studio和opencv中测试我的程序时说,上面的函数对我来说是可行的,但是,当我在eclipse环境中使用Android和ndk时,相同的程序向我显示了错误。这种方法也适用于Android ndk和eclipse?因为在循环中无法解决
类型“Mat::iterator”上的错误,并且
方法“mul”无法解决
与循环中的错误,所以对于copyTo()方法
“copyTo”无法解决,这只是一个想法。对不起,我没有在Android上测试它。您提到的方法有一些问题,我在我的案例中解决了这些问题,使用上述解决方法,但不是在Android上。感谢@Froyo这是我想知道的,但在push_-back参数
无效参数的候选参数上显示错误为:void push_-back(const cv::Mat&)“
oah它在清理项目后工作,但它没有在我的设备上显示输出,看起来它在语义上工作,在逻辑上失败,那么
resize
.clone()
你尝试了
channel.resize(3)
,为什么会工作呢?这没有任何意义。你必须使用
cv::resize
函数。是的,但我检查了你的
乘法
选项,它在android NDK上不显示我的输出,虽然它也不显示错误,但整个过程也不显示输出
for(Mat::iterator I=channel.begin();I!=channel.end();I++) {
   (*I) = (*I).mul(mask);
}
merge(channel,it);
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 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);