Android-未调用OnPreviewFrame
这是我的cameraPreview,我在SurfaceChanged中设置了侦听器。 我可以在应用程序中看到摄像头,但从未调用OnPreviewFrame。 下面是大部分代码Android-未调用OnPreviewFrame,android,opencv,android-camera,previewcallback,Android,Opencv,Android Camera,Previewcallback,这是我的cameraPreview,我在SurfaceChanged中设置了侦听器。 我可以在应用程序中看到摄像头,但从未调用OnPreviewFrame。 下面是大部分代码 public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback { private static boolean DEBUGGING = true; private static final String LO
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
private static boolean DEBUGGING = true;
private static final String LOG_TAG = "CameraPreviewSample";
private static final String CAMERA_PARAM_ORIENTATION = "orientation";
private static final String CAMERA_PARAM_LANDSCAPE = "landscape";
private static final String CAMERA_PARAM_PORTRAIT = "portrait";
protected Activity mActivity;
private SurfaceHolder mHolder;
protected Camera mCamera;
protected List<Camera.Size> mPreviewSizeList;
protected List<Camera.Size> mPictureSizeList;
protected Camera.Size mPreviewSize;
protected Camera.Size mPictureSize;
private int mSurfaceChangedCallDepth = 0;
private int mCameraId;
private LayoutMode mLayoutMode;
private int mCenterPosX = -1;
private int mCenterPosY;
public Mat frame1=null;
public Mat frame2=null;
PreviewReadyCallback mPreviewReadyCallback = null;
//////Alon
public static int SENSITIVITY_VALUE = 20;
public static int BLUR_SIZE = 10;
public Rect objectBoundingRectangle = new Rect(0, 0, 0, 0);
double ballAverage = 131.5;
int frameCounter = 0;
public static enum LayoutMode {
FitToParent, // Scale to the size that no side is larger than the parent
NoBlank // Scale to the size that no side is smaller than the parent
};
public interface PreviewReadyCallback {
public void onPreviewReady();
}
/**
* State flag: true when surface's layout size is set and surfaceChanged()
* process has not been completed.
*/
protected boolean mSurfaceConfiguring = false;
public CameraPreview(Activity activity, int cameraId, LayoutMode mode) {
super(activity); // Always necessary
mActivity = activity;
mLayoutMode = mode;
mHolder = getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
if (Camera.getNumberOfCameras() > cameraId) {
mCameraId = cameraId;
} else {
mCameraId = 0;
}
} else {
mCameraId = 0;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
mCamera = Camera.open(mCameraId);
} else {
mCamera = Camera.open();
}
Camera.Parameters cameraParams = mCamera.getParameters();
mPreviewSizeList = cameraParams.getSupportedPreviewSizes();
mPictureSizeList = cameraParams.getSupportedPictureSizes();
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
mCamera.setPreviewDisplay(mHolder);
} catch (IOException e) {
mCamera.release();
mCamera = null;
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
mSurfaceChangedCallDepth++;
doSurfaceChanged(width, height);
mSurfaceChangedCallDepth--;
}
private void doSurfaceChanged(int width, int height) {
mCamera.stopPreview();
Camera.Parameters cameraParams = mCamera.getParameters();
boolean portrait = isPortrait();
// The code in this if-statement is prevented from executed again when surfaceChanged is
// called again due to the change of the layout size in this if-statement.
if (!mSurfaceConfiguring) {
Camera.Size previewSize = determinePreviewSize(portrait, width, height);
Camera.Size pictureSize = determinePictureSize(previewSize);
if (DEBUGGING) { Log.v(LOG_TAG, "Desired Preview Size - w: " + width + ", h: " + height); }
mPreviewSize = previewSize;
mPictureSize = pictureSize;
mSurfaceConfiguring = adjustSurfaceLayoutSize(previewSize, portrait, width, height);
// Continue executing this method if this method is called recursively.
// Recursive call of surfaceChanged is very special case, which is a path from
// the catch clause at the end of this method.
// The later part of this method should be executed as well in the recursive
// invocation of this method, because the layout change made in this recursive
// call will not trigger another invocation of this method.
if (mSurfaceConfiguring && (mSurfaceChangedCallDepth <= 1)) {
return;
}
}
configureCameraParameters(cameraParams, portrait);
mSurfaceConfiguring = false;
try {
mCamera.startPreview();
} catch (Exception e) {
Log.w(LOG_TAG, "Failed to start preview: " + e.getMessage());
// Remove failed size
mPreviewSizeList.remove(mPreviewSize);
mPreviewSize = null;
// Reconfigure
if (mPreviewSizeList.size() > 0) { // prevent infinite loop
surfaceChanged(null, 0, width, height);
} else {
Toast.makeText(mActivity, "Can't start preview", Toast.LENGTH_LONG).show();
Log.w(LOG_TAG, "Gave up starting preview");
}
}
if (null != mPreviewReadyCallback) {
mPreviewReadyCallback.onPreviewReady();
}
//////////////////////////Alon
if (mCamera == null) {
return;
}
mCamera.setPreviewCallback(new PreviewCallback() {
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
Mat frame = Byte_to_Mat(data);
if(frame1==null) {
frame1 = frame;
}
else
{
if (frame2 == null)
{
frame2 = frame;
}
else
{
frame1 = frame2;
frame2 = frame;
}
detectBall(frame1,frame2);
}
}
});
}
public Mat Byte_to_Mat(byte[] data) {
Mat jpegData = new Mat(1, data.length, CvType.CV_8UC1);
jpegData.put(0, 0, data);
return jpegData;
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
stop();
}
public void stop() {
if (null == mCamera) {
return;
}
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
public boolean isPortrait() {
return (mActivity.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT);
}
public void setOneShotPreviewCallback(PreviewCallback callback) {
if (null == mCamera) {
return;
}
mCamera.setOneShotPreviewCallback(callback);
}
public void setPreviewCallback(PreviewCallback callback) {
if (null == mCamera) {
return;
}
mCamera.setPreviewCallback(callback);
}
public Camera.Size getPreviewSize() {
return mPreviewSize;
}
public void setOnPreviewReady(PreviewReadyCallback cb) {
mPreviewReadyCallback = cb;
}
公共类CameraPreview扩展了SurfaceView实现了SurfaceHolder.Callback{
私有静态布尔调试=true;
私有静态最终字符串日志\u TAG=“CameraPreviewSample”;
专用静态最终字符串摄影机参数方向=“方向”;
专用静态最终字符串CAMERA_PARAM_横向=“横向”;
专用静态最终字符串照相机参数纵向=“纵向”;
保护活性;
私人地勤人员;
受保护的摄像机mCamera;
受保护列表mPreviewSizeList;
受保护列表;
受保护的摄像头。大小mPreviewSize;
受保护的摄像头。大小和大小;
private int mSurfaceChangedCallDepth=0;
麦卡默雷德私人酒店;
私人布局模式mLayoutMode;
私有int-mCenterPosX=-1;
私营企业;
公共Mat frame1=null;
公共Mat frame2=null;
PreviewerAyCallback MPReviewerAyCallback=null;
//////阿隆
公共静态int灵敏度_值=20;
公共静态整型模糊大小=10;
public Rect objectBoundingRectangle=新Rect(0,0,0,0);
双平均压载=131.5;
int frameCounter=0;
公共静态枚举布局模式{
FitToParent,//缩放到没有边大于父边的大小
NoBlank//缩放到没有边小于父边的大小
};
公共接口预览和回调{
公共无效;无效;无效();
}
/**
*状态标志:当设置了曲面的布局大小并且surfaceChanged()时为true
*该过程尚未完成。
*/
受保护的布尔值mSurfaceConfiguring=false;
公共CameraPreview(活动、内部cameraId、布局模式){
超级(活动);//总是必要的
活动性=活动性;
mLayoutMode=模式;
mHolder=getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE\u TYPE\u PUSH\u缓冲区);
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.gingerbrand){
if(Camera.getNumberOfCameras()>camerRAID){
mCameraId=cameraId;
}否则{
mCameraId=0;
}
}否则{
mCameraId=0;
}
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.gingerbrand){
mCamera=Camera.open(mCameraId);
}否则{
mCamera=Camera.open();
}
Camera.Parameters cameraParams=mCamera.getParameters();
MPReviewIzeList=cameraParams.getSupportedPreviewSizes();
mpicuteResizeList=cameraParams.getSupportedPictureSizes();
}
@凌驾
已创建的公共空白表面(表面持有人){
试一试{
mCamera.setPreviewDisplay(mHolder);
}捕获(IOE异常){
mCamera.release();
mCamera=null;
}
}
@凌驾
公共空白表面更改(表面文件夹持有者、整型格式、整型宽度、整型高度){
mSurfaceChangedCallDepth++;
doSurfaceChanged(宽度、高度);
mSurfaceChangedCallDepth--;
}
私有void doSurfaceChanged(整数宽度、整数高度){
mCamera.stopPreview();
Camera.Parameters cameraParams=mCamera.getParameters();
布尔纵向=isPortrait();
//当SURFACHECHANGE被禁用时,将阻止再次执行此if语句中的代码
//由于此if语句中布局大小的更改而再次调用。
如果(!mSurfaceConfiguring){
Camera.Size previewSize=确定预览大小(纵向、宽度、高度);
Camera.Size pictureSize=确定图像大小(previewSize);
if(调试){Log.v(Log_标记,“所需预览大小-w:+width+”,h:+height);}
mPreviewSize=预览大小;
mPictureSize=图片大小化;
msurfaceconfiguration=调整surfacelayoutsize(预览大小、纵向、宽度、高度);
//如果递归调用此方法,则继续执行此方法。
//surfaceChanged的递归调用是非常特殊的情况,它是来自
//此方法末尾的catch子句。
//该方法的后面部分也应该在递归过程中执行
//调用此方法,因为布局更改在此递归
//调用将不会触发此方法的另一次调用。
if(mSurfaceConfiguring&&(mSurfaceChangedCallDepth 0){//防止无限循环
表面更改(空、0、宽度、高度);
}否则{
Toast.makeText(mActivity,“无法开始预览”,Toast.LENGTH_LONG.show();
w(Log_标签,“放弃启动预览”);
}
}
if(null!=mprevieweradycallback){
mPreviewReadyCallback.onPreviewReady();
}
//////////////////////////阿隆
if(mCamera==null){
返回;
}
setPreviewCallback(新的PreviewCallback(){
@凌驾
预览帧上的公共无效(字节[]数据,摄像头){
Mat frame=字节到Mat(数据);
if(frame1==null){
框架1=框架;
}
其他的
{
if(frame2==null)
{
框架2=框架;
}
其他的
{
frame1=frame2;
框架2=框架;
}
探测球(第1帧、第2帧);
}
}
});
}
公用Mat字节到Mat(字节[]数据){
Mat jpegData=新Mat(1,data.length,CvType.CV_8U