内容简介:前面《Processing 中使用OpenCV4处理摄像头画面(7)》是通过Java的 PImage 获取数据交给OpenCV处理(并没有实现处理逻辑)。这篇是直接通过调用OpenCV的 VideoCatrue 实现摄像头数据的获取,然后转换成PImage的数据格式显示。一、环境
前面《Processing 中使用OpenCV4处理摄像头画面(7)》是通过 Java 的 PImage 获取数据交给OpenCV处理(并没有实现处理逻辑)。
这篇是直接通过调用OpenCV的 VideoCatrue 实现摄像头数据的获取,然后转换成PImage的数据格式显示。
一、环境
需要OpenCV4的类库。
1、安装这个插件--一劳永逸
https://blog.csdn.net/teamlet/article/details/85240506
2、自己下载文件
下载地址: https://github.com/teamlet/OpenCV4-for-Processing/tree/master/lib
在当前项目根路径下创建code文件夹,把opencv-400.jar和libopencv_java400.dylib复制到code文件夹中。
二、代码
import org.opencv.core.*; import org.opencv.videoio.*; import org.opencv.imgproc.*; import java.nio.ByteBuffer; VideoCapture cap; Mat fm; void setup() { size(640, 480); System.loadLibrary(Core.NATIVE_LIBRARY_NAME); cap = new VideoCapture(); cap.set(Videoio.CAP_PROP_FRAME_WIDTH, width); cap.set(Videoio.CAP_PROP_FRAME_HEIGHT, height); cap.open(Videoio.CAP_ANY); fm = new Mat(); frameRate(30); } void draw() { background(0); Mat tmp = new Mat(); cap.read(tmp); Imgproc.cvtColor(tmp, fm, Imgproc.COLOR_BGR2RGBA); PImage img = matToImg(fm); image(img, 0, 0); tmp.release(); } PImage matToImg(Mat m) { PImage im = createImage(m.cols(), m.rows(), ARGB); ByteBuffer b = ByteBuffer.allocate(m.rows()*m.cols()*m.channels()); m.get(0, 0, b.array()); b.rewind(); b.asIntBuffer().get(im.pixels); im.updatePixels(); return im; }
执行过程方法说明:
setup 方法:
size(640, 480); // 设置窗口宽度和高度。
cap = new VideoCapture(); // 创建OpenCV摄像头对象
cap.set(Videoio.CAP_PROP_FRAME_WIDTH, width); // 设置摄像头宽度
cap.set(Videoio.CAP_PROP_FRAME_HEIGHT, height);// 设置摄像头高度
cap.open(Videoio.CAP_ANY); //打开摄像头
fm = new Mat(); // 创建空的矩阵
frameRate(30); // 设置每秒钟刷新 30 次。
draw方法:
Mat tmp = new Mat(); // 创建一个临时矩阵
cap.read(tmp); // 从摄像头读取一帧数据,保存到tmp 临时矩阵中。
Imgproc.cvtColor(tmp, fm, Imgproc.COLOR_BGR2RGBA); // 读取的数据只有 3个颜色通道BGR,转换为4个通道ARGB
PImage img = matToImg(fm); // 将矩阵数据转成 int [] 一纬数组。
image(img, 0, 0); // 显示图像
matToImg 方法:接收的参数是 Mat m
PImage im = createImage(m.cols(), m.rows(), ARGB); //根据矩阵的行数和列数,创建空白的PImage对象。
ByteBuffer b = ByteBuffer.allocate(m.rows()*m.cols()*m.channels());// 根据矩阵的行数、列数和channel数,创建空的数组。
m.get(0, 0, b.array()); // 把矩阵的图像数据写到数组中。
b.rewind(); // 数组指针移动到数组开始。
b.asIntBuffer().get(im.pixels); // 把数组中的图像数据保存到PImage的 pixels 中。
im.updatePixels(); // PImage更新数据,并返回
return im;
这里在从RGB到ARGB的转换出现了错位的情况。
后果就是这样:
对比一下之前的图像:point_down:
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Processing 中使用OpenCV4处理摄像头画面(7)
- 8千个城市2千万摄像头暴露:2018摄像头安全报告
- Qt 实战:多画面播放器项目
- 如何构建一个简单的摄像头组件
- [译] 充分利用多摄像头 API
- html5调用手机摄像头
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
HTML 压缩/解压工具
在线压缩/解压 HTML 代码
正则表达式在线测试
正则表达式在线测试