如何在肖像模式下使用OpenCV在Android应用程序中打开相机 [英] How to open Camera in Portrait Mode using OpenCV in Android Application

查看:823
本文介绍了如何在肖像模式下使用OpenCV在Android应用程序中打开相机的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用 OpveCV 2.4.7库当我在Android应用中使用 OpenCV 打开相机时,它会以横向模式显示相机。我尝试将活动方向设置为纵向模式,但仍然无法在全屏模式下显示相机,是使用OpenCV库在Android中以纵向模式打开相机的任何方式

$ b $目前我正在得到以下屏幕默认在Android中使用OpvenCV库





在纵向模式下,我需要全屏相机视图,但我会收到此





我已经尝试过矩阵转换,但我需要设置本地相机参数,我使用OpenCV打开相机,所以我不能直接访问相机。我使用了以下代码

  mOpenCvCameraView =(CameraBridgeViewBase)findViewById(R.id.image_manipulations_activity_surface_view); 
mOpenCvCameraView.setCvCameraViewListener(this);


解决方案

创建一个JavaCamResView类,扩展OPENCV的JavaCameraView。你得到相机控制。
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;

  import org.opencv.android.JavaCameraView; 
import org.opencv.core.Size;


import android.content.Context;
import android.hardware.Camera;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MenuItem;
import android.widget.Toast;

public class JavaCamResView extends JavaCameraView {

public JavaCamResView(Context context,AttributeSet attrs){
super(context,attrs);

}

public List< Camera.Size> getResolutionList(){
return mCamera.getParameters()。getSupportedPreviewSizes();
}

public void setResolution(Camera.Size resolution){
disconnectCamera();
connectCamera((int)resolution.width,(int)resolution.height);
}

public void setFocusMode(Context item,int type){

Camera.Parameters params = mCamera.getParameters();

List< String> FocusModes = params.getSupportedFocusModes();

switch(type){
case 0:
if(FocusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO))
params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO );
else
Toast.makeText(item,Auto Mode not supported,Toast.LENGTH_SHORT).show();
break;
case 1:
if(FocusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO))
params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
else
Toast.makeText(item,Continuous Mode not supported,Toast.LENGTH_SHORT).show();
break;
case 2:
if(FocusModes.contains(Camera.Parameters.FOCUS_MODE_EDOF))
params.setFocusMode(Camera.Parameters.FOCUS_MODE_EDOF);
else
Toast.makeText(item,EDOF Mode not supported,Toast.LENGTH_SHORT).show();
break;
case 3:
if(FocusModes.contains(Camera.Parameters.FOCUS_MODE_FIXED))
params.setFocusMode(Camera.Parameters.FOCUS_MODE_FIXED);
else
Toast.makeText(item,固定模式不支持,Toast.LENGTH_SHORT).show();
break;
case 4:
if(FocusModes.contains(Camera.Parameters.FOCUS_MODE_INFINITY))
params.setFocusMode(Camera.Parameters.FOCUS_MODE_INFINITY);
else
Toast.makeText(item,Infinity Mode not supported,Toast.LENGTH_SHORT).show();
break;
case 5:
if(FocusModes.contains(Camera.Parameters.FOCUS_MODE_MACRO))
params.setFocusMode(Camera.Parameters.FOCUS_MODE_MACRO);
else
Toast.makeText(item,Macro Mode not supported,Toast.LENGTH_SHORT).show();
break;
}

mCamera.setParameters(params);
}

public void setFlashMode(Context item,int type){

Camera.Parameters params = mCamera.getParameters();
List< String> FlashModes = params.getSupportedFlashModes();

switch(type){
case 0:
if(FlashModes.contains(Camera.Parameters.FLASH_MODE_AUTO))
params.setFlashMode(Camera.Parameters.FLASH_MODE_AUTO );
else
Toast.makeText(item,Auto Mode not supported,Toast.LENGTH_SHORT).show();
break;
case 1:
if(FlashModes.contains(Camera.Parameters.FLASH_MODE_OFF))
params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
else
Toast.makeText(item,Off Mode不支持,Toast.LENGTH_SHORT).show();
break;
case 2:
if(FlashModes.contains(Camera.Parameters.FLASH_MODE_ON))
params.setFlashMode(Camera.Parameters.FLASH_MODE_ON);
else
Toast.makeText(item,On Mode not supported,Toast.LENGTH_SHORT).show();
break;
case 3:
if(FlashModes.contains(Camera.Parameters.FLASH_MODE_RED_EYE))
params.setFlashMode(Camera.Parameters.FLASH_MODE_RED_EYE);
else
Toast.makeText(item,Red Eye Mode not supported,Toast.LENGTH_SHORT).show();
break;
case 4:
if(FlashModes.contains(Camera.Parameters.FLASH_MODE_TORCH))
params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
else
Toast.makeText(item,Torch Mode不支持,Toast.LENGTH_SHORT).show();
break;
}

mCamera.setParameters(params);
}

public Camera.Size getResolution(){

Camera.Parameters params = mCamera.getParameters();

Camera.Size s = params.getPreviewSize();
return s;
}

public void zoomIn()
{

Camera.Parameters params = mCamera.getParameters();
if(params.isZoomSupported()){
final int maxZoomLevel = params.getMaxZoom();
int currentZoomLevel = params.getZoom();
Log.i(max ZOOM,is+ maxZoomLevel);
Log.i(current ZOOM,is+ currentZoomLevel);

if(currentZoomLevel< maxZoomLevel){
currentZoomLevel ++;
params.setZoom(currentZoomLevel);
mCamera.setParameters(params);

}

}
else
{
Log.i(ZOOM,NOT Supported);

}

}

public int getExposure()
{
Camera.Parameters params = mCamera.getParameters ;
return params.getExposureCompensation();
}
public int getMinExposure()
{
Camera.Parameters params = mCamera.getParameters();
return params.getMinExposureCompensation();
}
public int getMaxExposure()
{
Camera.Parameters params = mCamera.getParameters();
return params.getMaxExposureCompensation();
}
public void setExposure(int exposure)
{
Camera.Parameters params = mCamera.getParameters();
params.setExposureCompensation(exposure);
mCamera.setParameters(params);

}

public void setZoom(int zoom_value)
{

Camera.Parameters params = mCamera.getParameters();
if(params.isZoomSupported()){
final int maxZoomLevel = params.getMaxZoom();
int currentZoomLevel = params.getZoom();


// Log.i(CAMERA_SETTING,Exposure setting =+ params.get(exposure));
Log.i(CAMERA_SETTING,Current Exposure Compansation =+ params.getExposureCompensation());
Log.i(CAMERA_SETTING,min Exposure Compansation =+ params.getMinExposure Compensation());
Log.i(CAMERA_SETTING,Max Exposure Compansation =+ params.getMaxExposureCompensation());
Log.i(CAMERA_SETTING,White Balance setting =+ params.get(whitebalance));
Log.i(CAMERA_SETTING,支持的白平衡模式:+ params.get(whitebalance-values));
if(zoom_value< maxZoomLevel){
params.setZoom(zoom_value);
mCamera.setParameters(params);

}

}
else
{
Log.i(ZOOM,NOT Supported);

}

}
public void zoomOut()
{

Camera.Parameters params = mCamera.getParameters ;
if(params.isZoomSupported()){

int currentZoomLevel = params.getZoom();
Log.i(current ZOOM,is+ currentZoomLevel);

if(currentZoomLevel> 0){
currentZoomLevel--;
params.setZoom(currentZoomLevel);
mCamera.setParameters(params);

}

}
else
{
Log.i(ZOOM,NOT Supported);

}

}

public void getPictureSize()
{
Camera.Parameters params = mCamera.getParameters() ;
List< Camera.Size> sizes = params.getSupportedPreviewSizes();
Camera.Size mSize;
for(Camera.Size size:sizes){
Log.i(CAMERA_SIZE,可用分辨率:+ size.width ++ size.height);
mSize = size;
}
params.setPictureSize(1280,768);
mCamera.setParameters(params);
}

public void getOptimalPreviewSize(int w,int h){
final double ASPECT_TOLERANCE = 0.1;
double targetRatio =(double)h / w;

Camera.Parameters params = mCamera.getParameters();
List< Camera.Size> sizes = params.getSupportedPreviewSizes();

if(sizes == null)return;

Camera.Size optimumSize = null;
double minDiff = Double.MAX_VALUE;

int targetHeight = h;

for(Camera.Size size:sizes){
double ratio =(double)size.width / size.height;
if(Math.abs(ratio - targetRatio)> ASPECT_TOLERANCE)continue;
if(Math.abs(size.height - targetHeight)< minDiff){
optimumSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}

if(optimalSize == null){
minDiff = Double.MAX_VALUE;
for(Camera.Size size:sizes){
if(Math.abs(size.height - targetHeight)< minDiff){
optimumSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
}
Log.i(CAMERA_SIZE,Optimal Size:+ optimalSize.width ++ optimumSize.height);
}

public void changeOrientation()throws NoSuchMethodException,InvocationTargetException,IllegalAccessException {
Method rotateMethod;
rotateMethod = android.hardware.Camera.class.getMethod(setDisplayOrientation,int.class);
rotateMethod.invoke(mCamera,90);
}




} b $ b


I am using OpveCV 2.4.7 library When i use OpenCV in Android Application for open Camera then it shows the camera in Landscape mode. I tried by setting Activity Orientation to Portrait mode, but still it is not showing camera in full screen, is their any way to open camera in Portrait mode in Android using OpenCV Library

Currently I am getting following screen default In android using OpvenCV Library

I need full screen camera view in Portrait mode but i am getting this

I have tried Matrix transformation but i need to set Native Camera Parameters , i am using OpenCV to open camera so i can't directly access the camera. I have used following code

    mOpenCvCameraView=(CameraBridgeViewBase) findViewById(R.id.image_manipulations_activity_surface_view);
    mOpenCvCameraView.setCvCameraViewListener(this);

解决方案

You can do this. Make a JavaCamResView class which extends JavaCameraView of OPENCV. The you get camera Controls. import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.List;

            import org.opencv.android.JavaCameraView;
            import org.opencv.core.Size;


            import android.content.Context;
            import android.hardware.Camera;
            import android.util.AttributeSet;
            import android.util.Log;
            import android.view.MenuItem;
            import android.widget.Toast;

            public class JavaCamResView extends JavaCameraView {

                public JavaCamResView(Context context, AttributeSet attrs) {
                    super(context, attrs);

                }

                public List<Camera.Size> getResolutionList() {
                    return  mCamera.getParameters().getSupportedPreviewSizes();
                }

                public void setResolution(Camera.Size resolution) {
                    disconnectCamera();
                    connectCamera((int)resolution.width, (int)resolution.height);
                }

                public void setFocusMode (Context item, int type){

                    Camera.Parameters params = mCamera.getParameters();

                    List<String> FocusModes = params.getSupportedFocusModes();

                    switch (type){
                        case 0:
                            if (FocusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO))
                                params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
                            else
                                Toast.makeText(item, "Auto Mode not supported", Toast.LENGTH_SHORT).show();
                            break;
                        case 1:
                            if (FocusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO))
                                params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
                            else
                                Toast.makeText(item, "Continuous Mode not supported", Toast.LENGTH_SHORT).show();
                            break;
                        case 2:
                            if (FocusModes.contains(Camera.Parameters.FOCUS_MODE_EDOF))
                                params.setFocusMode(Camera.Parameters.FOCUS_MODE_EDOF);
                            else
                                Toast.makeText(item, "EDOF Mode not supported", Toast.LENGTH_SHORT).show();
                            break;
                        case 3:
                            if (FocusModes.contains(Camera.Parameters.FOCUS_MODE_FIXED))
                                params.setFocusMode(Camera.Parameters.FOCUS_MODE_FIXED);
                            else
                                Toast.makeText(item, "Fixed Mode not supported", Toast.LENGTH_SHORT).show();
                            break;
                        case 4:
                            if (FocusModes.contains(Camera.Parameters.FOCUS_MODE_INFINITY))
                                params.setFocusMode(Camera.Parameters.FOCUS_MODE_INFINITY);
                            else
                                Toast.makeText(item, "Infinity Mode not supported", Toast.LENGTH_SHORT).show();
                            break;
                        case 5:
                            if (FocusModes.contains(Camera.Parameters.FOCUS_MODE_MACRO))
                                params.setFocusMode(Camera.Parameters.FOCUS_MODE_MACRO);
                            else
                                Toast.makeText(item, "Macro Mode not supported", Toast.LENGTH_SHORT).show();
                            break;
                    }

                    mCamera.setParameters(params);
                }

                public void setFlashMode (Context item, int type){

                    Camera.Parameters params = mCamera.getParameters();
                    List<String> FlashModes = params.getSupportedFlashModes();

                    switch (type){
                        case 0:
                            if (FlashModes.contains(Camera.Parameters.FLASH_MODE_AUTO))
                                params.setFlashMode(Camera.Parameters.FLASH_MODE_AUTO);
                            else
                                Toast.makeText(item, "Auto Mode not supported", Toast.LENGTH_SHORT).show();
                            break;
                        case 1:
                            if (FlashModes.contains(Camera.Parameters.FLASH_MODE_OFF))
                                params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
                            else
                                Toast.makeText(item, "Off Mode not supported", Toast.LENGTH_SHORT).show();
                            break;
                        case 2:
                            if (FlashModes.contains(Camera.Parameters.FLASH_MODE_ON))
                                params.setFlashMode(Camera.Parameters.FLASH_MODE_ON);
                            else
                                Toast.makeText(item, "On Mode not supported", Toast.LENGTH_SHORT).show();
                            break;
                        case 3:
                            if (FlashModes.contains(Camera.Parameters.FLASH_MODE_RED_EYE))
                                params.setFlashMode(Camera.Parameters.FLASH_MODE_RED_EYE);
                            else
                                Toast.makeText(item, "Red Eye Mode not supported", Toast.LENGTH_SHORT).show();
                            break;
                        case 4:
                            if (FlashModes.contains(Camera.Parameters.FLASH_MODE_TORCH))
                                params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
                            else
                                Toast.makeText(item, "Torch Mode not supported", Toast.LENGTH_SHORT).show();
                            break;
                    }

                    mCamera.setParameters(params);
                }

                public Camera.Size getResolution() {

                    Camera.Parameters params = mCamera.getParameters();

                    Camera.Size s = params.getPreviewSize();
                    return s;
                }

                public void zoomIn()
                {

                    Camera.Parameters params = mCamera.getParameters();
                    if (params.isZoomSupported()) {
                        final int maxZoomLevel = params.getMaxZoom();
                        int currentZoomLevel = params.getZoom();
                        Log.i("max ZOOM ", "is " + maxZoomLevel);
                        Log.i("current ZOOM ", "is " + currentZoomLevel);

                        if(currentZoomLevel < maxZoomLevel){
                            currentZoomLevel++;
                            params.setZoom(currentZoomLevel);
                            mCamera.setParameters(params);

                        }

                    }
                    else
                    {
                        Log.i("ZOOM " , "NOT Supported");

                    }

                }

                public int getExposure()
                {
                    Camera.Parameters params = mCamera.getParameters();
                    return params.getExposureCompensation();
                }
                public int getMinExposure()
                {
                    Camera.Parameters params = mCamera.getParameters();
                    return params.getMinExposureCompensation();
                }
                public int getMaxExposure()
                {
                    Camera.Parameters params = mCamera.getParameters();
                    return params.getMaxExposureCompensation();
                }
                public void setExposure(int exposure)
                {
                        Camera.Parameters params = mCamera.getParameters();
                        params.setExposureCompensation(exposure);
                        mCamera.setParameters(params);

                    }

                public void setZoom(int zoom_value)
                {

                    Camera.Parameters params = mCamera.getParameters();
                    if (params.isZoomSupported()) {
                        final int maxZoomLevel = params.getMaxZoom();
                        int currentZoomLevel = params.getZoom();


                      //  Log.i("CAMERA_SETTING", "Exposure setting = " + params.get("exposure"));
                        Log.i("CAMERA_SETTING", "Current Exposure Compansation = " + params.getExposureCompensation());
                        Log.i("CAMERA_SETTING", "min Exposure Compansation = " + params.getMinExposureCompensation());
                        Log.i("CAMERA_SETTING", "Max Exposure Compansation = " + params.getMaxExposureCompensation());
                        Log.i("CAMERA_SETTING", "White Balance setting = " + params.get("whitebalance"));
                        Log.i("CAMERA_SETTING", "Supported White Balance Modes:" + params.get("whitebalance-values"));
                        if(zoom_value < maxZoomLevel){
                            params.setZoom(zoom_value);
                            mCamera.setParameters(params);

                        }

                    }
                    else
                    {
                        Log.i("ZOOM " , "NOT Supported");

                    }

                }
                public void zoomOut()
                {

                    Camera.Parameters params = mCamera.getParameters();
                    if (params.isZoomSupported()) {

                        int currentZoomLevel = params.getZoom();
                        Log.i("current ZOOM ", "is " + currentZoomLevel);

                        if(currentZoomLevel > 0 ){
                            currentZoomLevel--;
                            params.setZoom(currentZoomLevel);
                            mCamera.setParameters(params);

                        }

                    }
                    else
                    {
                        Log.i("ZOOM " , "NOT Supported");

                    }

                }

                public void getPictureSize()
                {
                    Camera.Parameters params = mCamera.getParameters();
                    List<Camera.Size> sizes = params.getSupportedPreviewSizes();
                    Camera.Size mSize;
                    for (Camera.Size size : sizes) {
                        Log.i("CAMERA_SIZE", "Available resolution: "+size.width+" "+size.height);
                        mSize = size;
                    }
                    params.setPictureSize(1280 , 768);
                    mCamera.setParameters(params);
                }

                public void getOptimalPreviewSize( int w, int h) {
                    final double ASPECT_TOLERANCE = 0.1;
                    double targetRatio=(double)h / w;

                    Camera.Parameters params = mCamera.getParameters();
                    List<Camera.Size> sizes = params.getSupportedPreviewSizes();

                    if (sizes == null) return;

                    Camera.Size optimalSize = null;
                    double minDiff = Double.MAX_VALUE;

                    int targetHeight = h;

                    for (Camera.Size size : sizes) {
                        double ratio = (double) size.width / size.height;
                        if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue;
                        if (Math.abs(size.height - targetHeight) < minDiff) {
                            optimalSize = size;
                            minDiff = Math.abs(size.height - targetHeight);
                        }
                    }

                    if (optimalSize == null) {
                        minDiff = Double.MAX_VALUE;
                        for (Camera.Size size : sizes) {
                            if (Math.abs(size.height - targetHeight) < minDiff) {
                                optimalSize = size;
                                minDiff = Math.abs(size.height - targetHeight);
                            }
                        }
                    }
                    Log.i("CAMERA_SIZE", "Optimal Size: "+optimalSize.width+" "+optimalSize.height);
                }

                public void changeOrientation() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
                    Method rotateMethod;
                    rotateMethod = android.hardware.Camera.class.getMethod("setDisplayOrientation", int.class);
                    rotateMethod.invoke(mCamera, 90);
                }




            }

这篇关于如何在肖像模式下使用OpenCV在Android应用程序中打开相机的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆