基于opencv的相机之图像保存异常/模糊背景/黑白背景(四)
2015-11-11 19:31
701 查看
简介
继续添加新功能,和改bug。。
图像保存异常
具体代码
查看拍摄图片发现图片的颜色异常,终于发现opencv下图片为BGR的格式,而Android上为RGB。所以需要在保存之前先交换下R和B通道的数据。
void BGRToRGB(Mat mat1){ int width, height, k, j; IplImage src1; CvScalar s1, s2; width = mat1.rows; height = mat1.cols; src1 = mat1; for(k = 0; k < width; k++){ for(j= 0; j< height; j++){ s1 = cvGet2D(&src1, k, j); s2.val[0] = s1.val[2]; s2.val[1] = s1.val[1]; s2.val[2] = s1.val[0]; cvSet2D(&src1, k, j, s2); } } }
先交换B、G通道之后在保存图片,不过这个方式会影响保存速度。
效果演示
(出问题图片) (修改后图片)
背景模糊
原理讲解
使用opencv集成的模糊函数,将选中图像之外的背景都模糊掉。 具体可以参考文档:opencv模拟景深效果 http://blog.csdn.net/u011630458/article/details/44103613
具体代码
1、在setting选项中,继续加入功能选项:背景模糊。接着该功能选择是否开启该功能。
private void initEdofPopupWindowView() { // TODO Auto-generated method stub myEdofListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) { if(arg2==0){ myVariable.myHDR = 0; myVariable.myTremble = 0; myVariable.myobjectTracking = 0; myVariable.myChromaFlash = 0; myVariable.myEdof = 1; myVariable.s.height= myVariable.screenHeight; myVariable.s.width= myVariable.screenWidth * 16 / 9; resolutionChange(); }else if(arg2 == 1){ myVariable.myEdof = 0; } } }); } private void initFirstPopupWindowView(View v) { firstListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) { .......... else if(arg2 == 6){ initEdofPopupWindowView(); } } }); }
这里可以看到,打开背景模糊功能之后,物体跟踪之类的功能全部会被强制关闭掉,同时也会从新设置camera的分辨率。
接着在预览界面绑定的Touch函数中,更新被选中的对象坐标。
@Override public boolean onTouch(View arg0, MotionEvent arg1) { ........... if(myVariable.myEdof == 1){ myVariable.myEdofTouch_x = (int)(arg1.getRawX() + (myVariable.screenWidth / 20)); myVariable.myEdofTouch_y = (int)(arg1.getRawY()); myVariable.myEdofFlag = 1; } .......... }
接着在预览更新函数中,进行具体的模糊操作。
@Override public Mat onCameraFrame(CvCameraViewFrame inputFrame) { // TODO Auto-generated method stub ........ if(myVariable.myEdof == 1){ PreviceGray.myEdofShow(myVariable.mRgba.getNativeObjAddr(), myVariable.myEdofTouch_x, myVariable.myEdofTouch_y, myVariable.myEdofFlag); myVariable.myEdofFlag = 0; } ........ }
myEdofShow也是用之前文档中的代码,ndk下移植过来的,以myEdofTouch_x、myEdofTouch_y为圆心,一定半径的圆为被选中的前景,其他的作为背景被模糊掉。
效果演示
效果截图如下:
(模糊背景)
需要注意,该模式下,计算导致运行效果并不理想。
黑白背景预览
具体代码
在预览模式中,新加入功能选项:黑白背景。和之前的背景模糊差不多,只是前者是将背景模糊掉,而这时是将背景灰阶化。
private void initPreviewPopupWindowView() { // TODO Auto-generated method stub previewListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) { if(arg2==0){ myVariable.previewFlag = 0; }else if(arg2 == 1){ myVariable.previewFlag = 1; }else if(arg2 == 2){ myVariable.previewFlag = 2; }else if (arg2 == 3){ myVariable.previewFlag = 3; myVariable.s.height= myVariable.screenHeight; myVariable.s.width= myVariable.screenWidth * 16 / 9; resolutionChange(); } } } }
当在预览模式下选择黑白背景选项后,previewFlag 被设置为3,同时更新camera的分辨率。接着在预览界面的touch函数中更新被选中的位置坐标。
@Override public boolean onTouch(View arg0, MotionEvent arg1) { // TODO Auto-generated method stub else if(myVariable.previewFlag == 3){ myVariable.myPreviewGrayPart_x = (int)(arg1.getRawX() + (myVariable.screenWidth / 20)); myVariable.myPreviewGrayPart_y = (int)(arg1.getRawY()); myVariable.myPreviewGrayPartFlag = 1; } }
更新的位置坐标保存在myPreviewGrayPart_x 、myPreviewGrayPart_y中,最后也是在预览更新函数中,ndk调用函数,进行对应操作处理。
@Override public Mat onCameraFrame(CvCameraViewFrame inputFrame) { // TODO Auto-generated method stub else if(myVariable.previewFlag == 3){ PreviceGray.myGrayPart(myVariable.mRgba.getNativeObjAddr(), myVariable.myPreviewGrayPartFlag, myVariable.myPreviewGrayPart_x, myVariable.myPreviewGrayPart_y); myVariable.myPreviewGrayPartFlag = 0; } }
效果演示
效果截图如下:
(黑白背景预览)
具体演示下载:http://download.csdn.net/detail/u011630458/9261617
相关文章推荐
- linux下通过命令行更新android sdk
- Linux NPTL 是什么
- Tomcat
- mysql+tomcat连接池配置
- 《大型网站技术架构》读书笔记1
- Codeforces Round #278 (Div. 1) B. Strip multiset维护DP
- 基于opencv的相机之物体跟踪/抖动检测/图库更新/模仿HDR/模仿ChromaFlash(三)
- Ted Mosby - 一个MVP框架的软件架构
- Linux上安装JDK环境变量配置
- 基于opencv的相机之camera切换/闪光灯/边缘模式/分辨率(二)
- shell中的条件表达式
- OpenLayers 3 之 加载天地图
- ubuntu14.04 install tomcat
- Linux多线程实践(8) --Posix条件变量解决生产者消费者问题
- linux设置外接显示器的分辨率
- Linux下高cpu解决方案
- 修改Tomcat控制台标题
- CURL_SETOPT()函数
- linux java so 历险
- linux 命令