基于opencv的相机之图像保存异常/模糊背景/黑白背景(四)

简介

  继续添加新功能,和改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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值