opencv - 为什么 toGray 函数不在设备上显示输出

标签 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, 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 的更改生效,您必须调用 ReleaseIntArrayElements()。但这永远不会执行,因为你先返回。 您的代码应该是:

   env->ReleaseIntArrayElements(in, _in, 0);
   env->ReleaseIntArrayElements(out, _out, 0);
   return retVal;

还有当你创建结果时

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

也就是说 bgra 是 3 个 channel 。但是当你在 toGray() 中执行 cvtColor(gray , bgra , CV_GRAY2BGRA); 时,需要一个 4 channel 目标,并且由于你提供了一个 3 channel Mat,bgra 将被重新分配(因此你的输出颜色将不会在 _out 数组中结束)。

关于opencv - 为什么 toGray 函数不在设备上显示输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25006688/

相关文章:

android-ndk - 如何正确安装 libshaderc 组件以在 Android Studio 中运行 Vulkan 示例代码?

java - 如何检查文件是否可读?

java - JNI : how to return byte array via java field?

python - 如何使用 Python OpenCV 查找表格图像中的行数和列数?

c++ - opencv人脸检测导调用脑崩溃

opencv - 从 RTP 数据包重建图像

android - 手动(aapt)将 native 库.so添加到apk

android - OpenCV:从已知大小的正方形中查找像素宽度

android - Android NDK 的 OpenMAX 可以用于将实时视频/音频流式传输到服务器吗?例子?

c++ - 如何在共享库的整个生命周期中存储数据