javaCV图像处理之Frame、Mat和IplImage三者相互转换(使用openCV进行Mat和IplImage转换)
前言:本篇文章依赖四个jar包,其中javacv.jar,javacpp.jar和opencv.jar为固定jar包,opencv-系统环境.jar为选配(根据自己的系统平台,x64还是x86而定)
须知:
OpenCVFrameConverter.ToIplImage可以用于将Frame转换为Mat和IplImage,Mat和IplImage转为Frame
Mat和IplImage之间的转换可以使用opeoCV库中提供的功能
使用方式:
static OpenCVFrameConverter.ToIplImage converter = new OpenCVFrameConverter.ToIplImage();
public static void converter(Frame frame) { // 将Frame转为Mat Mat mat = converter.convertToMat(frame); // 将Mat转为Frame Frame convertFrame1 = converter.convert(mat); // 将Frame转为IplImage IplImage image1 = converter.convertToIplImage(frame); IplImage image2 = converter.convert(frame); // 将IplImage转为Frame Frame convertFrame2 = converter.convert(image1); //Mat转IplImage IplImage matImage = new IplImage(mat); //IplImage转Mat Mat mat2 = new Mat(matImage); }
测试:
public static void main(String[] args) throws Exception { // 抓取取本机摄像头 OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0); grabber.start(); //取一帧视频(图像) converter(grabber.grab()); grabber.stop(); }
源码一览:
/** * A utility class to map data between {@link Frame} and {@link IplImage} or {@link Mat}. * Since this is an abstract class, one must choose between two concrete classes: * {@link ToIplImage} or {@link ToMat}. * * @author Samuel Audet */ public abstract class OpenCVFrameConverter<F> extends FrameConverter<F> { IplImage img; Mat mat; public static class ToIplImage extends OpenCVFrameConverter<IplImage> { @Override public Frame convert(IplImage img) { return super.convert(img); } @Override public IplImage convert(Frame frame) { return convertToIplImage(frame); } } public static class ToMat extends OpenCVFrameConverter<Mat> { @Override public Frame convert(Mat mat) { return super.convert(mat); } @Override public Mat convert(Frame frame) { return convertToMat(frame); } } public static int getFrameDepth(int depth) { switch (depth) { case IPL_DEPTH_8U: case CV_8U: return Frame.DEPTH_UBYTE; case IPL_DEPTH_8S: case CV_8S: return Frame.DEPTH_BYTE; case IPL_DEPTH_16U: case CV_16U: return Frame.DEPTH_USHORT; case IPL_DEPTH_16S: case CV_16S: return Frame.DEPTH_SHORT; case IPL_DEPTH_32F: case CV_32F: return Frame.DEPTH_FLOAT; case IPL_DEPTH_32S: case CV_32S: return Frame.DEPTH_INT; case IPL_DEPTH_64F: case CV_64F: return Frame.DEPTH_DOUBLE; default: return -1; } } public static int getIplImageDepth(int depth) { switch (depth) { case Frame.DEPTH_UBYTE: return IPL_DEPTH_8U; case Frame.DEPTH_BYTE: return IPL_DEPTH_8S; case Frame.DEPTH_USHORT: return IPL_DEPTH_16U; case Frame.DEPTH_SHORT: return IPL_DEPTH_16S; case Frame.DEPTH_FLOAT: return IPL_DEPTH_32F; case Frame.DEPTH_INT: return IPL_DEPTH_32S; case Frame.DEPTH_DOUBLE: return IPL_DEPTH_64F; default: return -1; } } static boolean isEqual(Frame frame, IplImage img) { return img != null && frame != null && frame.image != null && frame.image.length > 0 && frame.imageWidth == img.width() && frame.imageHeight == img.height() && frame.imageChannels == img.nChannels() && getIplImageDepth(frame.imageDepth) == img.depth() && new Pointer(frame.image[0]).address() == img.imageData().address() && frame.imageStride * Math.abs(frame.imageDepth) / 8 == img.widthStep(); } public IplImage convertToIplImage(Frame frame) { if (frame == null || frame.image == null) { return null; } else if (frame.opaque instanceof IplImage) { return (IplImage)frame.opaque; } else if (!isEqual(frame, img)) { int depth = getIplImageDepth(frame.imageDepth); img = depth < 0 ? null : IplImage.createHeader(frame.imageWidth, frame.imageHeight, depth, frame.imageChannels) .imageData(new BytePointer(new Pointer(frame.image[0].position(0)))) .widthStep(frame.imageStride * Math.abs(frame.imageDepth) / 8) .imageSize(frame.image[0].capacity() * Math.abs(frame.imageDepth) / 8); } return img; } public Frame convert(IplImage img) { if (img == null) { return null; } else if (!isEqual(frame, img)) { frame = new Frame(); frame.imageWidth = img.width(); frame.imageHeight = img.height(); frame.imageDepth = getFrameDepth(img.depth()); frame.imageChannels = img.nChannels(); frame.imageStride = img.widthStep() * 8 / Math.abs(frame.imageDepth); frame.image = new Buffer[] { img.createBuffer() }; frame.opaque = img; } return frame; } public static int getMatDepth(int depth) { switch (depth) { case Frame.DEPTH_UBYTE: return CV_8U; case Frame.DEPTH_BYTE: return CV_8S; case Frame.DEPTH_USHORT: return CV_16U; case Frame.DEPTH_SHORT: return CV_16S; case Frame.DEPTH_FLOAT: return CV_32F; case Frame.DEPTH_INT: return CV_32S; case Frame.DEPTH_DOUBLE: return CV_64F; default: return -1; } } static boolean isEqual(Frame frame, Mat mat) { return mat != null && frame != null && frame.image != null && frame.image.length > 0 && frame.imageWidth == mat.cols() && frame.imageHeight == mat.rows() && frame.imageChannels == mat.channels() && getMatDepth(frame.imageDepth) == mat.depth() && new Pointer(frame.image[0]).address() == mat.data().address() && frame.imageStride * Math.abs(frame.imageDepth) / 8 == (int)mat.step(); } public Mat convertToMat(Frame frame) { if (frame == null || frame.image == null) { return null; } else if (frame.opaque instanceof Mat) { return (Mat)frame.opaque; } else if (!isEqual(frame, mat)) { int depth = getMatDepth(frame.imageDepth); mat = depth < 0 ? null : new Mat(frame.imageHeight, frame.imageWidth, CV_MAKETYPE(depth, frame.imageChannels), new Pointer(frame.image[0].position(0)), frame.imageStride * Math.abs(frame.imageDepth) / 8); } return mat; } public Frame convert(Mat mat) { if (mat == null) { return null; } else if (!isEqual(frame, mat)) { frame = new Frame(); frame.imageWidth = mat.cols(); frame.imageHeight = mat.rows(); frame.imageDepth = getFrameDepth(mat.depth()); frame.imageChannels = mat.channels(); frame.imageStride = (int)mat.step() * 8 / Math.abs(frame.imageDepth); frame.image = new Buffer[] { mat.createBuffer() }; frame.opaque = mat; } return frame; } }
javaCV图像处理之Frame、Mat和IplImage三者相互转换(使用openCV进行Mat和IplImage转换)的更多相关文章
- opencv中Mat与IplImage,CVMat类型之间转换
opencv中对图像的处理是最基本的操作,一般的图像类型为IplImage类型,但是当我们对图像进行处理的时候,多数都是对像素矩阵进行处理,所以这三个类型之间的转换会对我们的工作带来便利. Mat类型 ...
- IplImage, CvMat, Mat 的关系和相互转换(转)
(看到的一篇非常好的文章,讲opencv内部类之间的关系的.) opencv中常见的与图像操作有关的数据容器有Mat,cvMat和IplImage,这三种类型都可以代表和显示图像,但是,Mat类型侧重 ...
- opencv基础知识------IplImage, CvMat, Mat 的关系和相互转换
Mat,cvMat和IplImage这三种类型都可以代表和显示图像,但是,Mat类型侧重于计算,数学性较高,openCV对Mat类型的计算也进行了优化.而CvMat和IplImage类型更侧重于“图像 ...
- OpenCV中Mat的详解
每次碰到Mat都得反复查具体的用法,网上的基础讲解不多,难得看到一篇,赶快转来收藏~ 原文地址:http://www.opencvchina.com/thread-1039-1-1.html 目标 我 ...
- opencv:Mat对象
Mat对象:图像文件的内存数据对象 读取为 Mat 对象 读取图像位Mat对象,获取图像的相关信息 #include <opencv2/opencv.hpp> #include <i ...
- opencv数据结构-MAT结构详解
1.定义 OpenCV中的C结构体有 CvMat 和 CvMatND,但后续的应用中指出 CvMat 和 CvMatND 弃用了,在C++封装中用 Mat 代替,另外旧版还有一个 IplImage,同 ...
- OpenCV(2)-Mat数据结构及访问Mat中像素
Mat数据结构 一开始OpenCV是基于C语言的,在比较早的教材例如<学习OpenCV>中,讲解的存储图像的数据结构还是IplImage,这样需要手动管理内存.现在存储图像的基本数据结构是 ...
- OpenCV中Mat总结
一.数字图像存储概述 数字图像存储时,我们存储的是图像每个像素点的数值,对应的是一个数字矩阵. 二.Mat的存储 1.OpenCV1基于C接口定义的图像存储格式IplImage*,直接暴露内存,如果忘 ...
- OpenCV中Mat的使用
一.数字图像存储概述 数字图像存储时,我们存储的是图像每个像素点的数值,对应的是一个数字矩阵. 二.Mat的存储 1.OpenCV1基于C接口定义的图像存储格式IplImage*,直接暴露内存,如果忘 ...
随机推荐
- grunt轻松入门
项目目录,js源文件 gruntest Gruntfile.js package.json -- js ext community_plugin.js glogin_frm_cover.js iLog ...
- Linux下安装Oracle的两种方式------有图形界面安装和静默安装
本文参考文章 http://blog.csdn.net/zonej/article/details/50680857 http://blog.csdn.net/tongzidane/article/d ...
- jquery.uploadifive 解决上传限制图片或文件大小
dotNet疯狂之路No.28 今天很残酷,明天更残酷,后天很美好,但是绝大部分人是死在明天晚上,只有那些真正的英雄才能见到后天的太阳. We're here to put a dent in t ...
- 转:Centos6.5_x86安装Redis。
Redis是一个高性能的,开源key-value型数据库.是构建高性能,可扩展的Web应用的完美解决方案,可以内存存储亦可持久化存储.因为要使用跨进程,跨服务级别的数据缓存,在对比多个方案后,决定使用 ...
- 数值类型中JDk的编译期检查和编译期优化
byte b1 = 5;//编译期检查,判断是否在byte范围内 byte b2 = 5+4;//编译期优化,相当于b2=9 byte b3 = 127;//编译通过,在byte范围内 byte b4 ...
- .net Ajax与后台一般处理程序(ashx) 交互
本文主要实现无动态刷新查询后台数据功能,主要用到ajax+ashx+sqlserver进行交互. 首先需要引用Jquery: <script language="javascript& ...
- WINFORM实现进程信息的查看,listview,点击,右键,右键菜单
1. 程序设计要求 设计程序来获取计算机中的进程信息 2.程序设计流程图 3.程序设计亮点 (0)程序启动时加载guide引导使用视频 (1)使用Listview控件显示出所有控件的名称. (2) ...
- Lists, Maps and Sets in Java
ArrayList vs LinkedList vs Vector From the hierarchy diagram, they all implement List interface. The ...
- [大数据]-Logstash-5.3.1的安装导入数据到Elasticsearch5.3.1并配置同义词过滤
阅读此文请先阅读上文:[大数据]-Elasticsearch5.3.1 IK分词,同义词/联想搜索设置,前面介绍了ES,Kibana5.3.1的安装配置,以及IK分词的安装和同义词设置,这里主要记录L ...
- 从 art-template 模版维护到动态加载的思考
自己用 art-template 有些年头了,最近在培养团队学习 art-template 使用,发现有一个痛点比较难解决. 比如有一个模版,我们可以直接写在页面中,像这样: <script i ...