为什么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;
}
答案 0 :(得分:2)
我认为_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个频道。但是当您在toGray()中进行cvtColor(gray , bgra , CV_GRAY2BGRA);
时,需要一个4通道目标,并且由于您提供了3通道Mat,因此将重新分配bgra(因此您的输出颜色不会在_out数组中结束)。