您的位置:首页 > 运维架构

基于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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: