Java 需要一个建议:从相机处理彩色图像;安卓OpenCV;NDK;C++;
我想对安卓设备摄像头拍摄的图像预览进行一些预处理 我可以用以下方式描述我的申请: 1.)Java部分Java 需要一个建议:从相机处理彩色图像;安卓OpenCV;NDK;C++;,java,android,c++,opencv,android-ndk,Java,Android,C++,Opencv,Android Ndk,我想对安卓设备摄像头拍摄的图像预览进行一些预处理 我可以用以下方式描述我的申请: 1.)Java部分 // Getting preview from camera. public void onPreviewFrame(byte[] arg0, Camera arg1) { if (imageFormat == ImageFormat.NV21) { frameData = arg0; // private byte[] frameData = n
// Getting preview from camera.
public void onPreviewFrame(byte[] arg0, Camera arg1) {
if (imageFormat == ImageFormat.NV21) {
frameData = arg0; // private byte[] frameData = null;
}
}
// ...
// After some code - call native function.
ImageProcessing(width, height, frameData, output); // private int[] output= null;
// Setting output to bitmap, etc...
MyCameraPreview.setImageBitmap(bitmap); // Dislplay, etc...
2)C++部分。图像处理
extern "C"
jboolean huge_prefix_ImageProcessing(
JNIEnv* env,
jobject thiz,
jint width,
jint height,
jbyteArray frameData,
jintArray output)
{
jbyte* pFrameData = env->GetByteArrayElements(frameData, 0);
jint* pOutput = env->GetIntArrayElements(output, 0);
Mat gray(height, width, CV_8UC1, (unsigned char *)pFrameData);
// Some processing and writing gray to result.
// ...
return true;
}
对于灰度图像,一切都很完美。但是现在我需要对RGB图像进行处理。有人能给我一个正确的建议吗?我做了几次尝试:
- ImageProcessing函数内部将pFrameData转换为rgb格式(从nv21)
- 在函数onPreviewFrame中将nv21更改为RGB_565,并在图像容器中进行其他更改
- 你试过这样的东西吗?(从JNI包装器调用)
void convertYUV(int-width,int-height,jbyteArray-yuvArray){
//从JEnv那里得到数据。
签名字符*data=JNIEnvInfo::getInstance()->getJNIEnv()->GetByteArrayElements(yuvArray,0);
//转换为Mat对象。
Mat imgbuf(尺寸(宽度、高度)、CV_8UC4(无符号字符*)数据);
Mat img=imdecode(imgbuf、CV\u LOAD\u IMAGE\u COLOR);
//
//释放JNI数据指针。
JNIEnvInfo::getInstance()->getJNIEnv()->ReleaseByteArrayElements(yuvArray,(jbyte*)yuvArray,0);
//…用垫子做东西。。
}
Mat convertRGB(内部宽度,内部高度,金塔瑞rgb8888)
{
//
int*rgb;
int i;
//
//从JEnv那里得到数据。
int*data=JNIEnvInfo::getInstance()->getJNIEnv()->GetIntArrayElements(rgb8888,0);
//
//复制数据。
对于(i=0;igetJNIEnv()->ReleaseIntArrayElements(rgb888,(jint*)rgb888,0);
返回img;
}
您没有使用CvCameraViewFrame和onCameraFrame吗?不,反正我也没用过。但我现在会试试。因为当我玩它的时候,灰色和rgb的使用非常简单,所以我建议使用它们。我试过这种方法,程序在imdecode后终止。
void convertYUV( int width, int height, jbyteArray yuvArray ) {
// Get the data from JEnv.
signed char *data = JNIEnvInfo::getInstance()->getJNIEnv()->GetByteArrayElements(yuvArray, 0);
// Convert to Mat object.
Mat imgbuf(Size(width,height), CV_8UC4, (unsigned char*) data);
Mat img = imdecode(imgbuf, CV_LOAD_IMAGE_COLOR);
//
// Release the JNI data pointer.
JNIEnvInfo::getInstance()->getJNIEnv()->ReleaseByteArrayElements(yuvArray, (jbyte*) yuvArray, 0);
// ... do stuff with the Mat ..
}
Mat convertRGB(int width , int height , jintArray rgb8888)
{
//
int *rgb;
int i;
//
// Get the data from JEnv.
int *data = JNIEnvInfo::getInstance()->getJNIEnv()->GetIntArrayElements(rgb8888, 0);
//
// Copy the data.
for(i = 0; i < width * height; i++ ) {
rgb[i] = data[i];
}
//
// Convert to mat object.
Mat imgbuf(Size(width,height), CV_8UC3, rgb);
Mat img = imdecode(imgbuf, CV_LOAD_IMAGE_COLOR);
//
// Release the JNI data pointer.
JNIEnvInfo::getInstance()->getJNIEnv()->ReleaseIntArrayElements(rgb8888, (jint*) rgb8888, 0);
return img;
}