内容简介:前面《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调用手机摄像头
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
The Filter Bubble
Eli Pariser / Penguin Press / 2011-5-12 / GBP 16.45
In December 2009, Google began customizing its search results for each user. Instead of giving you the most broadly popular result, Google now tries to predict what you are most likely to click on. Ac......一起来看看 《The Filter Bubble》 这本书的介绍吧!