在Java中使用OpenCV捕获摄像头并生成图片和视频信息

OpenCV的jar包引入和dll加载见上一篇博文:
https://mp.csdn.net/editor/html/113079124

创建类VideoTest 

首先加载dll动态库,然后使用vc=new VideoCapture(0)创建一个摄像机对象,索引0表示系统中的第1个摄像机,如果有多个摄像头时下标从0开始。VideoCapture还有一个构建方法,可以传入字符串,可以传入视频文件的路径以打开视频文件。

vc.isOpened()用来判断视频源是否成功打开

下面看代码吧:

import java.net.URL;

import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.videoio.VideoCapture;
import org.opencv.videoio.VideoWriter;

public class VideoTest {

	public static void main(String[] args) throws Exception {
        // 加载动态库
        URL url = ClassLoader.getSystemResource("opencv_java451.dll");
        System.load(url.getPath());
		VideoCapture vc = new VideoCapture(0);
		if(!vc.isOpened()) {
			System.out.println("在电脑上未发现已连接的摄像头!");
			return;
		}
		captureImage(vc);
		captureVideo(vc);
	}

	private static void captureImage(VideoCapture vc) {
		Mat image = new Mat();
		vc.read(image);
		Imgcodecs.imwrite("D:\\demo.jpg", image);
		HighGui.imshow("显示图像", image);
		HighGui.waitKey();
	}

	private static void captureVideo(VideoCapture vc) throws InterruptedException {
		Mat image = new Mat();
		vc.read(image);
		VideoWriter vw = new VideoWriter();
		vw.open("D:\\demo.avi", VideoWriter.fourcc('D', 'I', 'V', 'X'), 25.0, new Size(image.width(), image.height()));
		System.out.println(vw.isOpened());
		for(int i=0;i<50;i++) {//捕获50帧,视频长度为2秒
			vc.read(image);
			if(image.empty()) {
				Thread.sleep(40);
				continue;
			}
			vw.write(image);
			Thread.sleep(400);//400ms捕获一次,相当于帧率为25
			System.out.println("read frame "+i);
		}
		vw.release();
		System.out.println("read finish!");
	}

}

运行成功后会在D盘生成一个demo.jpg和demo.avi文件,分别是捕获的第一张照片和2秒的视频信息,如果想将视频快进或慢放,可以适当调整帧率参数和捕获图片的间隔时间以达到想要的效果

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
要在C#使用OpenCV捕获8个摄像头并在子线程上运行,可以使用以下步骤: 1. 安装OpenCV库,可以从官方网站下载安装程序。 2. 在Visual Studio创建一个新的C#控制台应用程序。 3. 在项目添加OpenCV的引用,可以通过右键单击“引用” -> “添加引用” -> “浏览” -> 选择OpenCV的dll文件来完成。 4. 创建一个新的子线程,并在其启动所有8个摄像头捕获过程。 5. 在子线程使用OpenCVVideoCapture类初始化每个摄像头,并捕获每个摄像头的帧。 以下是一个示例代码,可以参考: ``` using System; using System.Threading; using OpenCvSharp; class Program { static readonly int NumCameras = 8; static void Main(string[] args) { // Create a new thread to capture frames from all cameras Thread thread = new Thread(new ThreadStart(CaptureFrames)); thread.Start(); // Main thread logic here... // Wait for the capture thread to finish thread.Join(); Console.WriteLine("Done!"); } static void CaptureFrames() { // Initialize all cameras and capture frames for (int i = 0; i < NumCameras; i++) { // Initialize the camera VideoCapture camera = new VideoCapture(i); // Start capturing frames while (true) { // Capture a frame Mat frame = new Mat(); camera.Read(frame); // Process the frame here... // Release the frame frame.Dispose(); // Sleep for a short time to avoid hogging the CPU Thread.Sleep(10); } // Release the camera camera.Dispose(); } } } ``` 请注意,该代码仅提供了一个基本框架,您需要根据自己的需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shuaijie506

您的打赏是我继续分享的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值