android jni打开摄像头,opencv,android_opencv4android开发获取摄像头帧数据处理后返回屏幕显示问题,opencv,android,ndk,jni - phpStud...

在Android应用中,开发者遇到一个问题:使用OpenCV在JNI层处理摄像头帧并在Java层显示时,处理后的人脸框消失。问题可能出在图片数据在JNI与Java间转换的过程中。代码显示在JNI中成功为人脸画框,但在Java层重新创建Bitmap并显示时,框没有显示。可能的原因是像素数据在转换过程中丢失。解决方案可能涉及检查数据转换步骤,确保处理后的像素信息正确传递到显示层。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

opencv4android开发获取摄像头帧数据处理后返回屏幕显示问题

我在JNI中用C++的opencv对图片进行了处理,就是在人脸上画了个框,但是传回Java再显示就没有框了,请问这是为什么以及该如何解决。部分代码如下:

Java代码:

public Mat onCameraFrame(CvCameraViewFrame inputFrame) {

mRgba = inputFrame.rgba();

Bitmap bmp_new = Bitmap.createBitmap(mRgba.cols(), mRgba.rows(),Bitmap.Config.ARGB_8888);

Utils.matToBitmap(mRgba, bmp_new, false);

int w = bmp_new.getWidth();

int h = bmp_new.getHeight();

int[] pixels = new int[w*h];

bmp_new.getPixels(pixels, 0, w, 0, 0, w, h);

int[] resultInt = facedetect(pixels, w, h); //native方法,在JNI进行处理,就是画框

Bitmap resultImg = Bitmap.createBitmap(w, h, Config.ARGB_8888);

resultImg.setPixels(resultInt, 0, w, 0, 0, w, h);

Mat mat_bmp = new Mat(resultImg.getHeight(), resultImg.getWidth(), CvType.CV_8UC4);

Utils.bitmapToMat(resultImg, mat_bmp, false);

return mat_bmp;

}

C++代码:

JNIEXPORT jintArray JNICALL Java_org_opencv_samples_facedetect_FdActivity_facedetect

(JNIEnv *env, jclass obj, jintArray buf, jint w, jint h){

jint *cbuf;

cbuf = env->GetIntArrayElements(buf, false);

if(cbuf == NULL){

return 0;

}

Mat imgData(h, w, CV_8UC4, (unsigned char*)cbuf);

//Load the cascades

face_cascade.load( face_cascade_name );

eyes_cascade.load( eyes_cascade_name );

//detect&draw

detectAndDisplay( imgData );

int size=w * h;

jintArray result = env->NewIntArray(size);

env->SetIntArrayRegion(result, 0, size, cbuf);

env->ReleaseIntArrayElements(buf, cbuf, 0);

return result;

}

/**

* @function detectAndDisplay

*/

void detectAndDisplay( Mat frame )

{

std::vector faces;

Mat frame_gray;

cvtColor( frame, frame_gray, COLOR_BGR2GRAY );

equalizeHist( frame_gray, frame_gray );

//-- Detect faces

face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) );

for( size_t i = 0; i < faces.size(); i++ )

{

Point center( faces.x + faces.width/2, faces.y + faces.height/2 );

ellipse( frame, center, Size( faces.width/2, faces.height/2), 0, 0, 360, Scalar( 255, 0, 255 ), 2, 8, 0 );

Mat faceROI = frame_gray( faces );

std::vector eyes;

//-- In each face, detect eyes

eyes_cascade.detectMultiScale( faceROI, eyes, 1.1, 2, 0 |CV_HAAR_SCALE_IMAGE, Size(30, 30) );

for( size_t j = 0; j < eyes.size(); j++ )

{

Point eye_center( faces.x + eyes[j].x + eyes[j].width/2, faces.y + eyes[j].y + eyes[j].height/2 );

int radius = cvRound( (eyes[j].width + eyes[j].height)*0.25 );

circle( frame, eye_center, radius, Scalar( 255, 0, 0), 3, 8, 0 );

}

}

}

希望大神能够告知问题所在。

相关阅读:

php if 判断的问题。

yeoman被墙,求解~

python中,如何删除html页面中的文字,只留下html标签?

哪里有详细的seleuimn的文档

使用jquery给img绑定error事件的问题

PMP证书到底有用吗技术人员想转管理方面该怎么办修改

语音合成实时播放问题

ubuntu 自动断网

一个奇怪的现象 求助!(一句话很难表述,请看正文...)

mysql海量数据的插入和查询

如何给动态添加的节点应用js

数据库不指定 varchar, int 这些字段类型的长度,有什么影响?

使用NSArray containObject:方法比较对象

Bcrypt加密速度慢是否是鸡肋?

Yii的Active Record应该是对YIIDao层的更高抽象。但是什么时候使用YIIDao什么使用使用AR?

此段代码字符串转换成整型时为何出错。

有没有好的数据库同步工具??

原生select下来框滚动条 纯css可以优化吗?

webfont 在IE情况下显示模糊

一个页面相同的JS效果相同HTML结构,如何让一个JS函数分别使用2个地方,互不干扰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值