[BUG记录]javacv连接1080p摄像头图像扭曲、视频卡顿问题解决记录

(105) 2024-06-14 08:01:01

[BUG记录]javacv连接1080p摄像头图像扭曲、视频卡顿问题解决记录

  • 环境
  • 问题描述
  • 问题代码
  • 解决方法
  • 解决代码
  • 解决后
  • 总结

环境

win10 64位系统
java version “1.8.0_172”
摄像头:罗技C920
javacv版本:1.4.2

<dependency> <groupId>org.bytedeco</groupId> <artifactId>javacv-platform</artifactId> <version>1.4.2</version> </dependency> 

问题描述

OpenCVFrameGrabber设置分辨率为1080P后出现图像扭曲的情况。如下图所示:
[BUG记录]javacv连接1080p摄像头图像扭曲、视频卡顿问题解决记录 (https://mushiming.com/)  第1张
[BUG记录]javacv连接1080p摄像头图像扭曲、视频卡顿问题解决记录 (https://mushiming.com/)  第2张
[BUG记录]javacv连接1080p摄像头图像扭曲、视频卡顿问题解决记录 (https://mushiming.com/)  第3张

问题代码

import org.bytedeco.javacv.*; import javax.swing.*; public class AAA { 
    public static void main(String[] args) throws Exception { 
    OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0); grabber.setFormat("MJPG"); //grabber.setFrameRate(1); grabber.setImageWidth(1920); grabber.setImageHeight(1080); grabber.start(); System.out.println(grabber.getFormat()); System.out.println(grabber.getFrameRate()); CanvasFrame canvas = new CanvasFrame(""); canvas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); while (true) { 
    if (!canvas.isEnabled()) { 
    grabber.stop(); System.exit(0); } Frame frame = grabber.grabFrame(); canvas.showImage(frame); } } } 

解决方法

设置format为MJPG,且不要设置frameRate。

解决代码

//略 OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0); grabber.setFormat("MJPG"); //grabber.setFrameRate(1); 设置帧率会使设置的格式失效 grabber.setImageWidth(1920); grabber.setImageHeight(1080); grabber.start(); //略 

解决后

[BUG记录]javacv连接1080p摄像头图像扭曲、视频卡顿问题解决记录 (https://mushiming.com/)  第4张
[BUG记录]javacv连接1080p摄像头图像扭曲、视频卡顿问题解决记录 (https://mushiming.com/)  第5张
[BUG记录]javacv连接1080p摄像头图像扭曲、视频卡顿问题解决记录 (https://mushiming.com/)  第6张

总结

从发现问题到解决一共花了两天,时间主要浪费在了搭建C++环境(因为从外网查到的一篇资料说可能是因为Java的性能问题),但是用C++调用opencv也会出现相同的扭曲现象(但C++打开摄像头的速度比Java要快很多).
后续自己乱试才试出来是因为设置了帧率的问题。。

THE END

发表回复