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个地方,互不干扰