opencv3_java 启动摄像头 VideoCapture Videoio_橘子派的博客-程序员宅基地

技术标签: opencv3  java  OpenCV3_Java_实战示例  

启动摄像头 VideoCapture Videoio


package opencv_java_demo;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;

import java.awt.*;
import java.awt.image.BufferedImage;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.videoio.VideoCapture;
import org.opencv.videoio.Videoio;

public class CaptureBasic extends JPanel {
	private static final long serialVersionUID=1L;
	
	private BufferedImage mImg;
	
	private BufferedImage mat2BI(Mat mat){
		int dataSize =mat.cols()*mat.rows()*(int)mat.elemSize();
		byte[] data=new byte[dataSize];
		mat.get(0, 0,data);
		int type=mat.channels()==1?
				BufferedImage.TYPE_BYTE_GRAY:BufferedImage.TYPE_3BYTE_BGR;
		
		if(type==BufferedImage.TYPE_3BYTE_BGR){
			for(int i=0;i<dataSize;i+=3){
				byte blue=data[i+0];
				data[i+0]=data[i+2];
				data[i+2]=blue;
			}
		}
		BufferedImage image=new BufferedImage(mat.cols(),mat.rows(),type);
		image.getRaster().setDataElements(0, 0, mat.cols(), mat.rows(), data);
		
		return image;
	}

	public void paintComponent(Graphics g){
		if(mImg!=null){
			g.drawImage(mImg, 0, 0, mImg.getWidth(),mImg.getHeight(),this);
		}
	}
	
	public static void main(String[] args) {
		try{
			System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
			
			Mat capImg=new Mat();
			VideoCapture capture=new VideoCapture(0);
			int height = (int)capture.get(Videoio.CAP_PROP_FRAME_HEIGHT);
			int width = (int)capture.get(Videoio.CAP_PROP_FRAME_WIDTH);
			if(height==0||width==0){
				throw new Exception("camera not found!");
			}
			
			JFrame frame=new JFrame("camera");
			frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
			CaptureBasic panel=new CaptureBasic();
			frame.setContentPane(panel);
			frame.setVisible(true);
			frame.setSize(width+frame.getInsets().left+frame.getInsets().right,
					height+frame.getInsets().top+frame.getInsets().bottom);
			while(frame.isShowing()){
				capture.read(capImg);
				panel.mImg=panel.mat2BI(capImg);
				panel.repaint();
			}
			capture.release();
			frame.dispose();
		}catch(Exception e){
			System.out.println("例外:" + e);
		}finally{
			System.out.println("--done--");
		}

	}

}




版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sileixinhua/article/details/72810728

智能推荐

java实现图片与base64字符串之间的转换_java 图片base64 占多少个字符-程序员宅基地

// 图片转化成base64字符串 public static byte[] GetImageStr() { String imgFile = "E://soft//1.jpg"; InputStream in = null; byte[] data = null; try { in = new FileInputStream(imgFile); dat_java 图片base64 占多少个字符

建模的starUML_staruml怎么缩放-程序员宅基地

第4章建模的StarUML本章详细介绍了程序创建图元素和编辑。 包括使用模型浏览器来组织模型结构。编辑元素和图组织模型结构编辑元素和图创建新图的StarUML支持11 UML图表类型。 用户可以自由地创建,并根据需要管理不同的图表。程序创建新图:从模型资源管理器或图区选择元素包含新图。右键单击并选择[添加图表]菜单。 在做出选择的图表类型的新图将被创建。_staruml怎么缩放

notepad++安装插件的方法-程序员宅基地

1.插件下载:http://sourceforge.net/projects/npp-plugins/手动安装 1. 打开notepad++插件项目的官方网站:http://sourceforge.net/projects/npp-plugins/ 在列表中点击需要的插件File列表(或在顶部搜索框搜索你想要的插件),以Autosave为例。 ...

单片机采集电压信号(AD转换器的应用实例)上-程序员宅基地

单片机采集电压信号(AD转换的应用实例)上上一篇文章我们讲了如何把一个信号的峰值采集,今天我们来讲如何把它连入单片机上,这里我们采用的是Multisim仿真。我们都知道单片机采集的信号都是高电平和低电平,模拟量他是无法采集到的,他所能采取的知识数字量,所以我们应该吧采集到的模拟信号转换成数字信号,而这个桥梁就是AD转换器,先讲一下AD转换器的额原理的吧,下图是AD转换器的内部结构图:这只是..._单片机采集电压信号

Facebook F8开发者大会详解:从虚拟现实到聊天机器人-程序员宅基地

引言:周三和周四两天,Facebook的F8开发者大会如火如荼地召开着,其中有多项新产品和新功能宣布。这些产品和功能为什么对Facebook这个社交巨头如此重要呢,下面将为读者进行详细地解答。在今年的F8开发者大会上,Facebook宣布了一大堆新的产品和功能,从Messenger聊天平台到VR产品均有涉及。尽管“聊天机器人”,还有利用无人机来直播视频很有些噱头的感觉,但Facebook确..._聊天机器人提供合成的虚拟朋友

GJK算法求凸多边形之间的距离_gjk 计算凸多边形的距离-程序员宅基地

GJK算法最初用来求三维空间中凸多面体的距离(即最近距离),也因此经常用来做碰撞检测(距离是否为0)。后被推广到n维空间中求凸包之间的距离,此处用来求二维平面上2个凸多边形的距离。 GJK算法首先要解决计算Minkowski和的问题。所谓Minkowski和,指A、B两个集合,令A+B={x+y,其中x属于A,y属于B}即二者的Minkowski和。类似的可以定义负集与Minkow..._gjk 计算凸多边形的距离

随便推点

try-catch-finally 规则( 异常处理语句的语法规则 )-程序员宅基地

1) 必须在 try 之后添加 catch 或 finally 块。try 块后可同时接 catch 和 finally 块,但至少有一个块。2) 必须遵循块顺序:若代码同时使用 catch 和 finally 块,则必须将 catch 块放在 try 块之后。3) catch 块与相应的异常类的类型相关。4) 一个 try 块可能有多个 catch 块。若如此,则执行第一个匹...

ESD二极管-程序员宅基地

提及电路保护器件,脑海里自然而然出现的是:ESD二极管、TVS瞬态抑制二极管、压敏电阻、自恢复保险丝、陶瓷气体放电管等等。接下来重点要分享的是有关ESD二极管的话题。关于ESD二极管,您知道多少呢?ESD二极管如何选型?ESD二极管有哪些封装呢?​ESD二极管工作原理当系统没有异常干扰时,正常工作时,ESD静电保护二极管可以忽略不计,不起任何作用。但是当外部接口电压超过ESD二极管的击穿电压时,ESD二极管开始起作用,并将电流分流到地。ESD有三种模型,分别是人体模型(HBM)ESD(为了芯_esd二极管

Maya命令型插件_mpxcommand-程序员宅基地

一 基础概念这里主要介绍用Maya C++ API进行插件开发的一些基本概念。1 对象类型Maya API包含了四种类型的对象:Wrappers,Objects,Function Sets以及Proxies,这四种对象构成了Maya API所有内容。 WrappersWrapper是API提供的一个基础性的类,它包含了一些基础数据类,实用的工_mpxcommand

elasticsearch5.6.1集群安装-程序员宅基地

下载ES5.6.1: wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.6.1.tar.gz解压到当前文件夹: tar -xzvf elasticsearch-5.6.1.tar.gz修改sysctl文件:sudo vim /etc/sysctl.conf ,增加下面配置项:注意在每台机...

centos7自带openjdk | javac命令报错bash:javac:command not found | yum provide javac_-bash: javac: command not found-程序员宅基地

前言:centos7,没有另外手动安装过jdk。检查java -version发现自带了jdk。但运行javac命令报错:bash:javac:command not found/问题分析:自带的jdk默认只安装了运行环境(找到jdk的安装目录下,发现只有jre文件夹,没有bin、lib等文件夹)。自查方法:(1)先找到jdk的安装目录[root@localhost home]# whi..._-bash: javac: command not found

NeoAxis Engine 游戏引擎-程序员宅基地

github:https://github.com/NeoAxis/NeoAxisEngine官方网站:https://www.neoaxis.com/Main featuresRoyalty-free, open source platform. Modern architecture and design of the editor. Built-in C# and visual scripting. Complete set of tools. .NET API..NE..._neoaxis engine

推荐文章

热门文章

相关标签