Processing 中使用OpenCV4处理摄像头画面(8)

栏目: 编程工具 · 发布时间: 7年前

内容简介:前面《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的转换出现了错位的情况。

后果就是这样:

Processing 中使用OpenCV4处理摄像头画面(8)

对比一下之前的图像:point_down:

Processing 中使用OpenCV4处理摄像头画面(8)


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

The Filter Bubble

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》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

随机密码生成器
随机密码生成器

多种字符组合密码

URL 编码/解码
URL 编码/解码

URL 编码/解码