fastcv 2 —— fastcorner例子浅析

归海一啸 2014-09-09 12:18:45
http://blog.csdn.net/ggtaas/article/details/9735305
看高通的Vuforia 或者 fastcv,或者说看所有的使用NDK编程的应用,我一般都是按照两层来看的。一个Java层,一个Native层。今天就从这两层来简单分析一下。

一.java层

我的理解是java层又可以分为application层和framework层。fastcorner的app层主要提供UI界面、camera调用,framework层提供接口函数,实现native层与java层之间的数据通信。fastcorner这个例子中有很多这样的接口函数。分别实现各自的功能,大家从函数名称或者源码注释上可以看出实现的什么功能。这里我只简单介绍几个例子。

例如在FastCVSample这个类中

public native float getCameraFPS();//获取帧速
private native void setGaussianEnable(boolean enableGaussian);//设置高斯滤波
private native int getNumCorners();//获取角点数量
还有一个最重要的方法,这个是角点检测的实现类。其中data是通过camera获取实时的视频帧的数据,w,h分别为视频帧的高和宽

public native void update( byte[] data, int w, int h );
fastcvcorner这个例子中有个很特别的地方就是,他通过OpenGL来达到对视频帧的渲染效果。这个让我想到了高通AR SDK模块中的一个模块。

Video Background Renderer

The video background renderer module renders the camera image stored in the state object. The performance of the background video rendering is optimized for specific devices.

看fastcv,结合高通ARSDK一起,你会有很多收货的。

在FastCVSampleRenderer类中有这些本地的方法,例如

public native void render();//Video Background Renderring
public native void cleanup();//free 内存释放
public native float getGPUFPS();//获取fps
接下来主要讲public native void update( byte[] data, int w, int h );这个方法的实现

这个是在FastCVSample.h定义的方法,其中的参数前面说过了,对于env和obj,不清楚的童鞋先去看看jni有关知识,否则看这些会比较费解的,:)

JNIEXPORT void JNICALL Java_com_qualcomm_fastcorner_FastCVSample_update
(
JNIEnv* env,
jobject obj,
jbyteArray img,
jint w,
jint h
);
在FastCVSample.cpp中实现这个方法

jbyte* jimgData = NULL;
jimgData = env->GetByteArrayElements( img, &isCopy );
获取视频帧的数据。

获取之后要对其进行格式转换,因为摄像头获取的是YUV420格式的,要将其转换成RGB565。这个又可以联想到高通ARSDK。

Image Converter

The pixel format converter converts from the camera format (e.g., YUV12) to a format suitable for OpenGL ES rendering (e.g., RGB565) and for tracking (e.g., luminance) internally.

转换之前,先将获取的数据
转换成uint8_t

uint8_t* pJimgData = (uint8_t*)jimgData;
因为fcvColorYUV420toRGB565u8()与其他fastcv函数要求这种格式的。

之后判断是否采用RGB还是灰度格式?

这个也是通过本地方法来设置的

private native void setViewFinderEnable(boolean enableViewFinder);
JNIEXPORT void JNICALL
Java_com_qualcomm_fastcorner_FastCVSample_setViewFinderEnable
(
JNIEnv* env,
jobject obj,
jboolean disableViewFinder
)
{
state.disableVF = (bool)disableViewFinder;
}
使用fcvColorYUV420toRGB565u8进行格式转换

fcvColorYUV420toRGB565u8(
pJimgData,
w,
h,
(uint32_t*)renderBuffer );
数据格式和图像格式转换完成之后,调用

updateCorners( (uint8_t*)pJimgData, w, h );进行角点检测了。
角点检测之前对图像进行downscale操作,有点类似图形金字塔,减小计算量,之后进行高斯过滤,最后才用fast9x进行角点检测。

downscale操作:

fcvScaleDownu8( (uint8_t*)data,
w,
h,
state.scaledImgBuf,
state.scaledImgWidth,
state.scaledImgHeight );
高斯过滤:

fcvFilterGaussian3x3u8( dataBuf,
dataBufWidth,
dataBufHeight,
state.blurredImgBuf,
0 );
角点检测:

fcvCornerFast9u8( (uint8_t*)dataBuf,
dataBufWidth,
dataBufHeight,
0,
state.cornerThreshold,
7,
state.corners,
MAX_CORNERS_TO_DETECT,
&state.numCorners );
检测之后进行角点绘制

drawCorners( state.corners, state.numCorners );
最后释放内存

env->ReleaseByteArrayElements( img, jimgData, JNI_ABORT );
最后,虽然这个例子实现的效果很简单,但是里面的内容还是很丰富的。没想到里面居然还有Video Background Renderer部分,算是个意外的惊喜吧。跟Opencv相比,实现的步骤要繁琐一点,但是效果肯定要好。所以后面打算用fastcv再实现MAR,看看跟Opencv相比怎么样,:)有兴趣的朋友可以一起讨论!

本文只无任何商业用途,特此声明!
...全文
1989 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
资源下载链接为: https://pan.quark.cn/s/0c983733fad2 本文主要回顾了2021年之前及2021年中国科学技术大学软件学院(简称“中科大软院”)高级软件工程(MN)专业的考试情况,重点聚焦于编程题。编程题在考试中的占比不断提高,因此考生需要深入理解这些题目及其解题方法。 中科大软院的高级软件工程专业致力于培养具备深厚理论基础和强大实践能力的高级软件人才。课程设计注重理论与实践相结合,以满足软件行业对高素质工程师的需求。考试内容通常涵盖计算机基础知识、软件工程理论、编程语言、数据结构与算法、操作系统、数据库系统等多个领域。2021年的考试中,编程题的比重进一步提升,这体现了学院对学生实际编程能力和问题解决能力的重视。 编程题通常涉及常见的编程问题,例如字符串处理、数组操作、递归算法、图论问题等,也可能包括网络编程、数据库查询或系统设计等特定领域的应用。考生需要熟练掌握至少一种编程语言,如C++、Java、Python等,并具备较强的算法分析和实现能力。在解题过程中,考生需要注意以下几点:一是准确理解题目要求,避免因误解而导致错误;二是合理选择并设计算法,考虑时间复杂度和空间复杂度,追求高效性;三是遵循良好的编程规范,注重代码的可读性和可维护性;四是考虑边界条件和异常情况,编写健壮的代码;五是编写测试用例,对代码进行充分测试,及时发现并修复问题。 对于备考的同学,建议多做历年试题,尤其是编程题,以熟悉题型和解题思路。同时,可以参加编程竞赛或在在线编程平台(如LeetCode、HackerRank)进行实战训练,提升编程和问题解决能力。此外,关注PPT中的编程代码也很关键,因为这些代码可能是老师给出的示例或解题思路,能够帮助学生更好地理解和掌握编程题的解法。因此,考生需要深入学习PPT内容,理解代码逻辑,并学会将其应用到实际编程题目中。 总之,对于

2,853

社区成员

发帖
与我相关
我的任务
社区描述
本论坛以AI、WoS 、XR、IoT、Auto、生成式AI等核心板块组成,为开发者提供便捷及高效的学习和交流平台。 高通开发者专区主页:https://qualcomm.csdn.net/
人工智能物联网机器学习 技术论坛(原bbs) 北京·东城区
社区管理员
  • csdnsqst0050
  • chipseeker
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧