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)


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

查看所有标签

猜你喜欢:

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

OKR工作法

OKR工作法

克里斯蒂娜•沃特克 (Christina Wodtke) / 明道团队 / 中信出版社 / 2017-9-1 / CNY 42.00

《OKR工作法》讲述了一种风靡硅谷科技企业的全新工作模式。 如何激励不同的团队一起工作,全力以赴去实现一个有挑战性的目标? 硅谷的两个年轻人汉娜和杰克,像很多人一样,在萌生了一个创意后,就走上创业之路。但是,很快他们发现好的想法远远不够,必须还有一套适合的管理方法确保梦想能实现。为了让创业团队生存下来,汉娜和杰克遭受了内心的苦苦挣扎和煎熬。他们患上“新奇事物综合症”,什么都想做,导致无......一起来看看 《OKR工作法》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具