插件文档描述
简单的矩形示例

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using OpenCVForUnity.ImgprocModule;
using OpenCVForUnity.ImgcodecsModule;
using OpenCVForUnity.CoreModule;
using Rect = OpenCVForUnity.CoreModule.Rect;
using OpenCVForUnity.UnityUtils;
using UnityEngine.UI;public class TestOpenCv : MonoBehaviour
{public RawImage rawImage;// Start is called before the first frame updatevoid Start(){// 定义一个mat Mat mat=  Imgcodecs.imread(Application.streamingAssetsPath + "/pca_test1.jpg",1);List<Mat> channels = new List<Mat>();//拆分rgb// Core.split(mat, channels);//bgr=>rgbMat mat2 = channels[2];channels[2] = channels[0];channels[0] = mat2;//g值为0// channels[1].setTo(new Scalar(0,0,0,0));//b值为0// channels[2].setTo(new Scalar(0, 0, 0, 0));//只保留一个r通道//合并rgb// Core.merge(channels, mat);//边界填充// Core.copyMakeBorder(mat, mat, top, bottom, left, right, Core.BORDER_REFLECT, new Scalar(255));//定义一个新的mat 更每一个像素点相加// Mat mat3 = new Mat(mat.size(), CvType.CV_8UC3,new Scalar(60,60,60,0));//mat = mat+ mat3;//画一个矩形选框Imgproc.rectangle(mat, new Point(10, 10), new Point(200, 200), new Scalar(255, 0, 0, 255), 5);//设置当前mat.size缩放比例//Imgproc.resize(mat, mat, new Size(0, 0), 2, 5);//Debug.Log(mat.size());Texture2D texture = new Texture2D(mat.cols(), mat.rows(), TextureFormat.RGBA32, false);//texture.Apply()Utils.matToTexture2D(mat, texture);rawImage.texture = texture;}}
   // Mat 基本图像容器   不知道mat作用的可以阅读一下https://www.w3cschool.cn/opencv/opencv-bedc2caa.html
静态方法方法 描述
Imgcodecs.imread(filename,flags) 读取一张图像 返回Mat对象 flags默认为彩色图像,1为彩色,0为灰度值
Imgcodecs.imwrite(filename,mat,MatOfInt) 保存图像 其中 MatOfInt 参考下文
Imgproc.cvtColor() 将图像从一种颜色空间转换为另一种颜色空间 可以参数OpenCVForUnityExample场景使用Imgproc.COLOR_BGR2RGB
Imgproc.line 画线
Imgproc.rectangle 绘制一个简单的矩形框,参考MatchTemplateExample
Imgproc.circle 用给定的中心和半径绘制一个简单的或实心的圆
Imgproc.minEnclosureCircle 查找包含 2D 点集的最小面积的圆,该函数使用迭代算法找到二维点集的最小封闭圆
Imgproc.minEnclosureTriangle 查找包围二维点集的最小面积三角形并返回其面积。该函数找到一个包围给定二维点集的最小面积三角形并返回其面积
Imgproc.resize() 函数调整大小将图像 src 调整为指定大小 如果size为0 fx,fy是沿着x,y方向伸缩 比如fx=1,fy=2,fx不变 fy放大两倍,也可以设置具体的size值
Imgproc.threshold 图像阈值 dst输出图像 thresh阈值 maxval当像素超过阈值或者小于阈值时所赋予的值,type==>Imgproc.THRESH_OTSU参考在下面
Imgproc.blur 图像平滑操作 卷积概念 比如一个图像有噪音点,想要去除这些点,ksize为核的大小比如[3,3],周围3*3个像素点为一组,默认point(-1,-1)为核中心点,borderType 用于推断图像外的像素
Imgproc.boxFilter 方框滤波基本上与blur差不多normalize=true 归一化,如果为false 如果色域大于255则直接取255
Imgproc.GaussianBlur 高斯滤波 其它像素点离中心点像素点越近权重越大,效果比均指滤波好,参考 https://www.w3cschool.cn/opencv/opencv-a4gp2cfi.html
Imgproc.medianBlur 中值滤波,找寻其核里中间的值
Imgproc.erode 结构元素腐蚀源图像,参考在下面
Imgproc.dilate 扩展图像或者像素膨胀,跟erode相反,相当于shader中顶点沿着法线方向膨胀
Imgproc.morphologyEx 把图像的腐蚀操作和膨胀操作合为一起,开闭运算,其中op参数可以参考Imgproc.MORPH_OPEN这些值,MORPH_OPEN 先腐蚀再膨胀,MORPH_CLOSE 先膨胀再腐蚀,MORPH_GRADIENT 梯度运算 膨胀-腐蚀得到一个轮廓,MORPH_TOPHAT 原始输入-开运算结果(MORPH_OPEN),MORPH_BLACKHAT 闭运算(MORPH_CLOSE)-原始输入得到大致的轮廓.其它参数跟上面的差不多
Imgproc.Sobel 梯度算子 找出色素区域差异大的像素点
Imgproc.Scharr 也是一个图像边缘检测 比sobel显示的色彩更丰富一点
Imgproc.Laplacian 拉普拉斯算子 具体呈现效果自己试验 比sobel显示的色彩少一点
Imgproc.Canny Canny 算法查找图像中的边缘,参数 dx 和dy输入图像的 16 位 x 导数(CV_16SC1 或 CV_16SC3), 参数edges是输出边缘图,单通道 8 位图像,参数threshold1和threshold2是阈值用来确定真实和潜在的边缘
Imgproc.pyrUp 对图像进行上采样,然后对其进行模糊处理,该函数执行高斯金字塔构造的上采样步骤,它实际上可以用于构造拉普拉斯金字塔。首先,它通过注入零行和零列对源图像进行上采样,然后使用与 pyrDown 乘以 4 相同的内核对结果进行卷积,输出图像的大小计算为 {code Size(src.cols2, (src.rows2)}
Imgproc.pyrDown 计算公式code Size((src.cols+1)/2, (src.rows+1)/2) 图像向下采样
Core.split(mat, channels) 获取颜色通道的值rgb
Core.merge 可以与上面Core.split一起使用,修改为各通道值后在合并为rgb
Core.copyMakeBorder 边界填充 参数:上下左右分别填充多少以及对应的色值(Scalar) 和填充方式(borderType)
Core.add() 计算两个数组或一个数组和一个标量的每个元素的总和。大于255 取255的值
Core.addWeighted() 两个图片融合 alpha为src1的权重 ,beta为src2的参数,加上一个亮度值gamma,公式dst = src1×alpha + src2×beta + gamma
Core.convertScaleAbs 缩放、计算绝对值并将结果转换为 8 位

动态方法 描述
Mat.size() 获取图片像素点个数,也可以传入int值返回size的其中一个值,默认返回cols, rows两个值
Mat.setTo() 将所有或部分数组元素设置为指定值。
VideoCapture.open 打开视频文件流,返回bool 是否成功
VideoCapture.isOpened() 是否能打开视频流
VideoCapture.read 读取每一帧 返回bool 是否读取成功
VideoCapture.get 得到详情信息,比如格式 fps
VideoCapture.release 如果这个视频不需要,卸载当前内存的意思

创建mat的类型 Type (Core.CV_8U)

CV_8U - 8位无符号整数(0..255)CV_8S - 8位有符号整数(-128..127)CV_16U - 16位无符号整数(0..65535)CV_16S - 16位有符号整数(-32768..32767)CV_32S - 32位有符号整数(-2147483648..2147483647)CV_32F - 32位浮点数(-FLT_MAX..FLT_MAX,INF,NAN)CV_64F - 64位浮点数(-DBL_MAX..DBL_MAX,INF,NAN)//CV_32FC1,CV_32FC2,CV_32FC3 分别是单通道 灰度图,双通道(RGB彩色图像),三通道(rgb),四通道(rgba)

MatOfInt

16 位无符号 (CV_16U) 图像可以保存为 PNG、JPEG 2000 和 TIFF 格式
32 位浮点 (CV_32F) 图像可以保存为 PFM、TIFF、OpenEXR 和 Radiance HDR 格式;将使用 LogLuv 高动态范围编码(每像素 4 字节)保存 3 通道 (CV_32FC3) TIFF 图像
使用此功能可以保存带有 Alpha 通道的 PNG 图像。为此,请创建 8 位(或 16 位)4 通道图像 BGRA,其中 Alpha 通道在最后。完全透明的像素应将 alpha 设置为 0,

  string format = "jpg";MatOfInt compressionParams = new MatOfInt(1, 100);string format = "png";MatOfInt compressionParams = new MatOfInt (16, 0);

VideoCapture

使用 API 打开视频文件或捕获设备或 IP 视频流以进行视频捕获

 VideoCapture  capture = new VideoCapture ();//打开视频文件或捕获设备或 IP 视频流以进行视频捕获。capture.open (Utils.getFilePath (VIDEO_FILENAME));

(1) get方法 VideoCapture.get()

参数 Videoio.CAP_PROP_FORMAT,Videoio.CAP_PROP_POS_MSEC等可以找到这些目标值,根据需要取得

BorderTypes

阈值 (Imgproc.threshold)

Src输入图只能输入单通道图像,通常来说是灰度图

Imgproc.threshold(mat, mat, 127, 255, Imgproc.THRESH_BINARY);
比如这个示例 大于127的取白色,小于127的取黑色

1.Imgproc.CV_THRESH_BINARY 当像素超过阈值去maxval,否则取0
2.Imgproc.CV_THRESH_BINARY_INV 与上面的相反
3.Imgproc.CV_THRESH_TRUNC 大于阈值的部分设为阈值,否则不变
4.Imgproc.CV_THRESH_TOZERO 大于阈值的部分不变,否则设为0
5.Imgproc.CV_THRESH_TOZERO_INV 与上面4的相反

图像腐蚀操作 (Imgproc.erode)

一.Imgproc.erode (Mat src,Mat dst,Mat kernel,Point anchor,int iterations,int borderType,Scalar borderValue
)
二.Imgproc.erode ( Mat src,Mat dst,Mat kernel,Point anchor,int iterations,int borderType
)

1.iterations为迭代系数
2.borderValue 边界值在恒定边界
3.kerne= Mat.ones(30 ,30, CV_8U) 用于侵蚀的核结构元素 size[30,30]使用 30*30矩形结构元素构成

//核大小为3*3
Mat kerne= Mat.ones(30 ,30, CV_8U)
Imgproc.erode(src,dst,kerne,new Point(-1,-1),1)
//核的中心点为-1,-1
//迭代一次
Imgproc.erode(src,dst,kerne,new Point(-1,-1),1)
//迭代两次
Imgproc.erode(src,dst,kerne,new Point(-1,-1),2)
//迭代三次
Imgproc.erode(src,dst,kerne,new Point(-1,-1),2)

迭代图对比

边缘检测

简单列举两个具体实现都差不多

梯度算子(Imgproc.Sobel)


A为核的大小[3,3],Gx为像素点水平方向的梯度算子,Gy是垂直方向,其中[-1,0,+1,-2,0,+2,-1,0,+1]这些值是卷积核与矩阵A相乘
Imgproc.Sobel ( Mat src,Mat dst,int ddepth,int dx,int dy,int ksize,double scale,double delta,int borderType
)
mat在 8 位输入图像的情况下,它将导致截断导数
ddepth 为图像深度 通常为-1
dx和dy 分别为水平和垂直方向 Gx Gy 比如dx=1 dy=0,那么表示只算水平方向的正值
ksize 是sobel算子的大小 [3,3] 其值设为1、3、5 或 7

Canny算子 (Imgproc.Canny)

1.使用高斯滤波器,处理图像的噪声
2.计算每个梯度的强度和方向 G=sqre(Gx2,Gy2) ,θ=arctan(Gy/Gx) 他们的核与sobel一样
3.非极大值抑制 比较这个点与周围点的大小,如果是最大的则保存下来,如果不是则抑制掉
4.双阈值 梯度值>maxvalue:则处理为边界,梯度值<minvalue:则舍弃,minVal<梯度值<maxVal 跟边界点连接的则保留否则舍弃

 //边缘检测void TestSobel(){Texture2D matchshapes = Resources.Load("matchshapes") as Texture2D;Mat mat = new Mat(matchshapes.height, matchshapes.width, CvType.CV_8U);Utils.texture2DToMat(matchshapes, mat);Mat dst1=new Mat();//先计算dy 当dy为1时 当有色值为负的时候自动变为0为黑色,当dy=2时 ,是把负值转为绝对值永远为正Imgproc.Sobel(mat, dst1, -1, 0, 2, 3);Mat dst2= new Mat();Imgproc.Sobel(mat, dst2, -1, 2, 0, 3);//合并两个值Core.addWeighted(dst1, 0.5, dst2, 0.5, 0, mat);Texture2D texture = new Texture2D(mat.cols(), mat.rows(),TextureFormat.BGRA32, false);Utils.matToTexture2D(mat, texture);rawImage.texture = texture;}//cannyvoid TestCanny(){Mat mat=  Imgcodecs.imread(Application.streamingAssetsPath + "/lena.jpg", 0);Debug.Log(mat);Mat mat1 = Mat.ones(mat.size(), CvType.CV_8UC1);Imgproc.Canny(mat, mat1, 80, 120);//cannyTexture2D texture = new Texture2D(mat1.cols(), mat1.rows(), TextureFormat.BGRA32, false);Utils.matToTexture2D(mat1, texture);rawImage.texture = texture;//原图Texture2D texture1 = new Texture2D(mat.cols(), mat.rows(), TextureFormat.BGRA32, false);Utils.matToTexture2D(mat, texture1);GetRaw.texture = texture1;}


unity3d OpenCVForUnity(一)相关推荐

  1. Unity3D视频绿幕抠图的实现及优化

    Unity3D视频绿幕抠图的实现及优化 展开 本文是通过Shader处理绿幕的方式来实现Unity中视频(VideoPlayer)的绿幕抠图.因为项目原因,不追究细节(能用就好能用就好)orz可是我连 ...

  2. Unity3d C#利用OpenCV插件实现大华、海康摄像头广角(桶型)畸变矫正功能

    前言 如题,在很多摄像头下拍摄的画面存在较严重的畸变,很多图片无法直接使用,本人也是在正式项目中遇到这个问题,经过一段时间的折腾,终于实现了,这里整理一下并分享,实现过程和思路. 功能 矫正前: 矫正 ...

  3. unity3d游戏开发猜想——当程序猿老去

    程序猿将代码注入生命去打造互联网的浪潮之巅.当有一天他们老了.会走向那里,会做些什么? 非常多年以后,在我60岁的那天早晨,天刚蒙蒙亮我就起床了,先去公园晨练,然后回来做早餐(50岁的时候我学会了做饭 ...

  4. Unity3D 中 2D_Toolkit插件下载 和 导入方法

    Unity3D 中 2D_Toolkit插件下载 和 导入方法 1.你把下载来的包放到 安装目录:Editor\Standard Packages里面. 2.然后按ctrl+9,进入asset sto ...

  5. Unity3D 镜面反射

    原创文章如需转载请注明:转载自 脱莫柔Unity3D学习之旅 QQ群:[119706192] 本文链接地址: Unity3D 镜面反射 这是官方CharacterCustomization事例中的镜面 ...

  6. [推荐]C#快速开发3d游戏工具--Unity3d

    最近有幸接触了一点Unity3d的东西,和大家分享一下. Unity3d 简介 是一款可视化的,3d游戏开发软件.可以进行手动绘制3d场景,自己添加摄像机角度,3d模型设计,事件触发,对于园子里大家很 ...

  7. unity3d 切换网络_Unity3d新网络请求方式UnityWebRequest详解

    Unity将要逐步放弃www网络请求api,新的api请求方式来临:UnityWebRequestThe,也正是本篇文章要给大家介绍的重点,那就是UnityWebRequestThe的使用详解. 旧的 ...

  8. Unity3D提示“XX,some are mac os x (unix) and some are windows”

    2019独角兽企业重金招聘Python工程师标准>>> 解决办法: 将Unity安装目录\Editor\Data\Resources\ScriptTemplates\目录下的所有文件 ...

  9. unity3d教程运行物理机制

    首先,我们将把Hooke定律写Euler方法结合在一起找到新坐标.加速和速度. Hooke定律是F=kx,这里的F是指由水流产生的力(记住,我们将把水体表面模拟为水流),k是指水流的常量.x则是位移. ...

最新文章

  1. elasticdump安装_elasticsearch导出、导入工具-elasticdump
  2. 一次“ora-12170 tns 连接超时”的经历
  3. 字节博士搞的AI火了,一键完美分离人声和伴奏 | 在线可玩
  4. c++《VS2008 快捷键大全》
  5. SQL 常用语句INSERT INTO,UPDATE,DELETE
  6. eXtremeComponents文档
  7. MVC3.0+knockout.js+Ajax 实现简单的增删改查
  8. 状态机编程实例及适用范围
  9. MINA框架客户端的使用
  10. Vim Instruction Vim 指南
  11. 桌面运维之CMD命令
  12. 从南极之争谈软件架构十个技巧,及…
  13. SaaS软件真的需要客户运营吗?
  14. 分布式任务调度平台XXL-JOB深度实战
  15. 第12章 ‘expect’和‘assume’
  16. mac 电池不在充电
  17. 把一元硬币换成1分,2分5分的硬币有几种不同的方法
  18. 学英语《每日一歌》之far away from home
  19. 西文是指什么_计算机西文文字是指哪些?
  20. 国内程序员怎样竞争 Google 总部的工作机会,需要满足哪些条件?

热门文章

  1. 《谈判力》读书笔记:第六章 如果对方实力强大怎么办?(确定你的最佳替代方案)
  2. 客户满意度和客户忠诚度的计算标准
  3. TansorFlow和Keras的入门教程
  4. c语言里1300错误咋剞劂,手机微信怎么设置账号密码错误怎么办
  5. CSS中div的浮动float
  6. 用python进行金融市场文本数据的情感计算
  7. 文字在线转图片二维码的公用API接口
  8. K8S之kubelet介绍
  9. BZOJ 3931 CQOI2015 网络吞吐量 Dijkstra+网络流
  10. python应用学习(六)——tkinter制作连连看小游戏