Open the Android native Camera using OpenCV

2 down vote accepted

Have a look at the shipped opencv samples in opencv/samples/android/, there you should be able to find a few good examples. Here is also a link to the docs that shows how to open the camera. Don't forget to request the permissions to access the camera.

Short version, see the link for full details: Add a layout:

<org.opencv.android.JavaCameraView
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:visibility="gone"
    android:id="@+id/HelloOpenCvView"
    opencv:show_fps="true"
    opencv:camera_id="any" />

Init procedure:

private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
    @Override
    public void onManagerConnected(int status) {
        switch (status) {
            case LoaderCallbackInterface.SUCCESS:
            {
                Log.i(TAG, "OpenCV loaded successfully");
                mOpenCvCameraView.enableView();
            } break;
            default:
            {
                super.onManagerConnected(status);
            } break;
        }
    }
};

@Override
public void onResume()
{
    super.onResume();
    OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, mLoaderCallback);
}

Implement CVFrameListener2 interface:

 private CameraBridgeViewBase mOpenCvCameraView;

 @Override
 public void onCreate(Bundle savedInstanceState) {
     Log.i(TAG, "called onCreate");
     super.onCreate(savedInstanceState);
     getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
     setContentView(R.layout.HelloOpenCvLayout);
     mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.HelloOpenCvView);
     mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);
     mOpenCvCameraView.setCvCameraViewListener(this);
 }

 @Override
 public void onPause()
 {
     super.onPause();
     if (mOpenCvCameraView != null)
         mOpenCvCameraView.disableView();
 }

 public void onDestroy() {
     super.onDestroy();
     if (mOpenCvCameraView != null)
         mOpenCvCameraView.disableView();
 }

 public void onCameraViewStarted(int width, int height) {
 }

 public void onCameraViewStopped() {
 }

 public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
     return inputFrame.rgba();
 }
### 使用 OpenCV 保存录像的方法与示例 #### 方法概述 OpenCV 提供了 `cv2.VideoWriter` 类,用于将视频帧写入文件。要保存录像,需定义编解码器、指定输出文件名、设定帧率以及每帧的尺寸大小。以下是具体实现方式: --- #### Python 示例代码 以下是一个完整的 Python 示例,演示如何使用 OpenCV 将摄像头捕获的内容保存为视频文件[^3]。 ```python import cv2 # 初始化摄像头 cap = cv2.VideoCapture(0) # 获取视频的宽度和高度 frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 定义编解码器并创建 VideoWriter 对象 fourcc = cv2.VideoWriter_fourcc(*'XVID') # 设置编码格式 out = cv2.VideoWriter('output.avi', fourcc, 20.0, (frame_width, frame_height)) # 输出文件名为 'output.avi' while cap.isOpened(): ret, frame = cap.read() if ret: # 写入当前帧到文件 out.write(frame) # 显示实时画面 cv2.imshow('frame', frame) # 按下 'q' 键退出循环 if cv2.waitKey(1) & 0xFF == ord('q'): break else: break # 释放资源 cap.release() out.release() cv2.destroyAllWindows() ``` --- #### C++ 示例代码 对于 C++ 开发者,同样可以利用 OpenCV 的 API 来保存录像。下面是一段基于 C++ 的实现代码[^1]。 ```cpp #include <opencv2/opencv.hpp> using namespace cv; int main() { // 打开默认摄像头 VideoCapture cap(0); if (!cap.isOpened()) { std::cerr << "Error: Could not open camera." << std::endl; return -1; } // 获取视频分辨率 double fps = 20.0; // 帧率 Size frameSize(static_cast<int>(cap.get(CV_CAP_PROP_FRAME_WIDTH)), static_cast<int>(cap.get(CV_CAP_PROP_FRAME_HEIGHT))); // 定义编解码器并创建 VideoWriter 对象 VideoWriter writer("output.avi", CV_FOURCC('M', 'J', 'P', 'G'), fps, frameSize); Mat frame; while (true) { cap >> frame; // 读取一帧 if (frame.empty()) break; // 写入帧到文件 writer << frame; // 展示实时画面 imshow("Recording...", frame); // 按下 ESC 键退出循环 if (waitKey(30) >= 0) break; } // 释放资源 cap.release(); writer.release(); return 0; } ``` --- #### 关键点解析 1. **编解码器的选择** 编解码器决定了视频文件的压缩格式。常用的有 `'XVID'`, `'MJPG'` 等。如果遇到无法正常播放的情况,可能是因为选择了不兼容的编解码器[^2]。 2. **帧率设置** 帧率(Frames Per Second, FPS)影响视频流畅度。通常情况下,20~30 FPS 能够满足大多数需求。 3. **分辨率匹配** 录制时应确保输入帧的分辨率与 `VideoWriter` 构造函数中指定的一致,否则可能导致错误或异常行为。 4. **资源管理** 在程序结束前务必调用 `.release()` 方法关闭摄像头和视频写入对象,防止资源泄漏。 --- #### Java 示例代码 在 Java 中也可以借助 OpenCV 实现类似的功能[^4]。 ```java import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.videoio.VideoCapture; import org.opencv.videoio.VideoWriter; public class SaveVideoExample { public static void main(String[] args) { System.loadLibrary(Core.NATIVE_LIBRARY_NAME); // 初始化摄像头 VideoCapture capture = new VideoCapture(0); if (!capture.isOpened()) { System.out.println("Failed to open the camera."); return; } // 获取视频属性 int width = (int) capture.get(VideoCapture.PROPERTY_FRAME_WIDTH); int height = (int) capture.get(VideoCapture.PROPERTY_FRAME_HEIGHT); double fps = 20.0; // 创建 VideoWriter 对象 VideoWriter writer = new VideoWriter("output.avi", VideoWriter.fourcc('M', 'J', 'P', 'G'), fps, new org.opencv.core.Size(width, height)); Mat frame = new Mat(); while (capture.read(frame)) { writer.write(frame); // 写入帧 Core.imshow("Camera Feed", frame); // 显示实时画面 if (Core.waitKey(1) == 27) { // 按 Esc 键退出 break; } } // 释放资源 capture.release(); writer.release(); Core.destroyAllWindows(); } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值