Opencv 为什么toGray函数未在设备上显示输出

Opencv 为什么toGray函数未在设备上显示输出,opencv,android-ndk,java-native-interface,Opencv,Android Ndk,Java Native Interface,为什么toGray函数不在设备上显示输出,下面是我将图像转换为灰度的代码,我将代码更改为函数,但它不显示输出: using namespace std; using namespace cv; int toGray(Mat mSrc, Mat& bgra); extern "C" { JNIEXPORT jint JNICALL Java_org_opencv_samples_NativeActivity_CvNativeActivity_eqhist(JNIEnv* env, jo

为什么toGray函数不在设备上显示输出,下面是我将图像转换为灰度的代码,我将代码更改为函数,但它不显示输出:

using namespace std;
using namespace cv;
int toGray(Mat mSrc, Mat& bgra);

extern "C" {

JNIEXPORT jint JNICALL Java_org_opencv_samples_NativeActivity_CvNativeActivity_eqhist(JNIEnv* env, jobject,jint width, jint height, jintArray in, jintArray out)
   {
       jint* _in = env->GetIntArrayElements(in, 0);
       jint* _out = env->GetIntArrayElements(out, 0);

       Mat mSrc(height, width, CV_8UC4, (unsigned char*)_in);
       Mat bgra(height, width, CV_8UC4, (unsigned char*)_out);
       int conv;
       jint retVal;
       conv = toGray(mSrc, bgra);
       retVal = (jint)conv;
       return retVal;
       env->ReleaseIntArrayElements(in, _in, 0);
       env->ReleaseIntArrayElements(out, _out, 0);

   }
}

int toGray(Mat mSrc, Mat& bgra)
{
    Mat gray(mSrc.rows, mSrc.cols, CV_8UC1);
    cvtColor(mSrc , gray , CV_BGRA2GRAY);
    cvtColor(gray , bgra , CV_GRAY2BGRA);
    return 1;
}

我认为要使_out的更改生效,您必须调用
releaseintarayelements()
。但这永远不会执行,因为你先返回。 您的代码应该是:

   env->ReleaseIntArrayElements(in, _in, 0);
   env->ReleaseIntArrayElements(out, _out, 0);
   return retVal;
当您创建结果时也是如此

Mat bgra(height, width, CV_8UC3, (unsigned char*)_out);

也就是说bgra有3个频道。但是当你使用cvtColor时(灰色、bgra、CV_GRAY2BGRA)在toGray()中,需要一个4通道目标,并且由于您提供了一个3通道Mat,bgra将被重新分配(因此您的输出颜色将不会出现在_out数组中)。

您的答案是正确的。函数过早返回。至于toGray函数,我认为它是正确的。Android位图支持RGBA。所以单通道输出不起作用。因此,需要将灰色转换为bgra。@B。。。对不起,这不是
8UC3
,而是
8UC4