OpenCV for Unity(2.32)插件中的MatchShapesExample案例(Unity2018.2.6f1)

位置:OpenCVForUnity\Examples\MainModules\imgproc

目录

一、功能概括

二、场景结构

三、主要功能脚本分析

1 导入标准图形图片

2 导入对比图形图片

3 描边对比图片的轮廓

4 对比两张图片轮廓获取数据


一、功能概括

该案例中实现了图形轮廓描边(红色)、图形轮廓对比(绿色数据)的效果。

图1.1场景运行效果图

标准图形 (绿色数据为标准图形与对比图形比较之后获得的数据)

对比图形


二、场景结构

场景中包括四个物体

Cube 立方体主要用来作为展示对比图片的容器,改物体包含实现图形对比的主要脚本。

Main Camera 摄像机

Canvas UI的画布,该案例中主要用来放置Back Button,返回案例列表

EventSystem依附Canvas的必须


三、主要功能脚本分析

场景中只有Cube物体上有Script,其中TouchController脚本是控制鼠标点击控制立方旋转的,MatchShapesExample脚本为主要功能脚本

MatchShapesExmple中轮廓描边、图形对比在Start()中完成

1 导入标准图形图片

//srcMatTexture2D srcTexture = Resources.Load ("matchshapestest") as Texture2D;Mat srcMat = new Mat (srcTexture.height, srcTexture.width, CvType.CV_8UC1);Utils.texture2DToMat (srcTexture, srcMat);Debug.Log ("srcMat.ToString() " + srcMat.ToString ());Imgproc.threshold (srcMat, srcMat, 127, 255, Imgproc.THRESH_BINARY);

首先定义Texture变量存放图片,Resources.Load导入的图片是放在Resource文件夹下的,且需要修改图片为可读写(write/read)模式,如下图

之后需要将Texture个是转换为Mat格式。

  • Mat (int rows, int cols, int type)

type的值

//【1】CV_8UC1---则可以创建----8位无符号的单通道---灰度图片------grayImg

//【2】CV_8UC3---则可以创建----8位无符号的三通道---RGB彩色图像---colorImg

//【3】CV_8UC4--则可以创建-----8位无符号的四通道---带透明色的RGB图像

参考网址:https://blog.csdn.net/maweifei/article/details/51221259

Imgproc.threshold将图片二值化处理

  • Imgproc.threshold(Mat src,Mat dst,double thresh,double maxval,int type)

type

如果是THRESH_BINARY的话,就是二值化,从thresh为阈值进行判断每个像素点该归maxval还是0。

如果是THRESH_BINARY_INV的话,是反向二值化,从图中也可以看的出来,跟THRESH_BINARY是相反的。

如果是THRESH_TRUNC的话,trunc的意思是裁剪、修剪的意思,那么就是超过thresh的都等于tresh,不超过的等于原图像素点值。只针对超过thresh的像素点。

如果是THRESH_TOZERO的话,大于tresh的像素点维持原图像素值,小于的都为0。

如果是THRESH_TOZERO_INV的话,与4相反。

参考网址:https://blog.csdn.net/getyouwant/article/details/49717411

2 导入对比图形图片

//dstMatTexture2D dstTexture = Resources.Load ("matchshapestest") as Texture2D;Mat dstMat = new Mat (dstTexture.height, dstTexture.width, CvType.CV_8UC3);Utils.texture2DToMat (dstTexture, dstMat);Debug.Log ("dstMat.ToString() " + dstMat.ToString ());

3 描边对比图片的轮廓

 List<MatOfPoint> srcContours = new List<MatOfPoint> ();Mat srcHierarchy = new Mat ();/// Find srcContoursImgproc.findContours (srcMat, srcContours, srcHierarchy, Imgproc.RETR_CCOMP, Imgproc.CHAIN_APPROX_NONE);Debug.Log ("srcContours.Count " + srcContours.Count);for (int i=0; i<srcContours.Count; i++) {Imgproc.drawContours (dstMat, srcContours, i, new Scalar (255, 0, 0), 2, 8, srcHierarchy, 0, new Point ());}

findContours方法查找图像轮廓drawContours绘制图像轮廓,drawContours方法描边轮廓

  • findContours (Mat image, List<MatOfPoint> contours, Mat hierarchy, int mode, int method)

image:输入图像,图像必须为8-bit单通道图像,图像中的非零像素将被视为1,0像素保留其像素值,故加载图像后会自动转换为二值图像。我们同样可以使用cv::compare,cv::inRange,cv::threshold,cv::adaptiveThreshold,cv::Canny等函数来创建二值图像,,如果第四个参数为cv::RETR_CCOMP或cv::RETR_FLOODFILL,输入图像可以是32-bit整型图像(CV_32SC1)

contours:检测到的轮廓,每个轮廓都是以点向量的形式进行存储即使用point类型的vector表示

hierarchy:可选的输出向量(std::vector),包含了图像的拓扑信息,作为轮廓数量的表示hierarchy包含了很多元素,每个轮廓contours[i]对应hierarchy中hierarchy[i][0]~hierarchy[i][3],分别表示后一个轮廓,前一个轮廓,父轮廓,内嵌轮廓的索引,如果没有对应项,则相应的hierarchy[i]设置为负数。

mode轮廓检索模式,

RETR_EXTERNAL:表示只检测最外层轮廓,对所有轮廓设置hierarchy[i][2]=hierarchy[i][3]=-1

RETR_LIST:提取所有轮廓,并放置在list中,检测的轮廓不建立等级关系

RETR_CCOMP:提取所有轮廓,并将轮廓组织成双层结构(two-level hierarchy),顶层为连通域的外围边界,次层位内层边界

RETR_TREE:提取所有轮廓并重新建立网状轮廓结构

RETR_FLOODFILL:官网没有介绍,应该是洪水填充法

method值:

CHAIN_APPROX_NONE:获取每个轮廓的每个像素,相邻的两个点的像素位置差不超过1

CHAIN_APPROX_SIMPLE:压缩水平方向,垂直方向,对角线方向的元素,值保留该方向的重点坐标,如果一个矩形轮廓只需4个点来保存轮廓信息

CHAIN_APPROX_TC89_L1和CHAIN_APPROX_TC89_KCOS使用Teh-Chinl链逼近算法中的一种

  • drawContours (Mat image, List<MatOfPoint> contours, int contourIdx, Scalar color, int thickness, int lineType, Mat hierarchy, int maxLevel, Point offset)

image:输入输出图像,Mat类型即可

contours:使用findContours检测到的轮廓数据,每个轮廓以点向量的形式存储,point类型的vector

contourIdx:绘制轮廓的只是变量,如果为负值则绘制所有输入轮廓

color:轮廓颜色

thickness:绘制轮廓所用线条粗细度,如果值为负值,则在轮廓内部绘制

lineTpye:线条类型,有默认值LINE_8,有如下可选类型

hierarchy:可选层次结构信息

maxLevel:用于绘制轮廓的最大等级

offset:可选轮廓参数,用制定偏移量offset=(dx, dy)给出绘制轮廓的偏移量

参考网址:https://blog.csdn.net/keith_bb/article/details/70185209

4 对比两张图片轮廓获取数据

for (int i=0; i<srcContours.Count; i++) {double returnVal = Imgproc.matchShapes (srcContours [2], srcContours [i], Imgproc.CV_CONTOURS_MATCH_I1, 0);Debug.Log ("returnVal " + i + " " + returnVal);Point point = new Point ();float[] radius = new float[1];Imgproc.minEnclosingCircle (new MatOfPoint2f (srcContours [i].toArray ()), point, radius);Debug.Log ("point.ToString() " + point.ToString ());Debug.Log ("radius.ToString() " + radius [0]);Imgproc.circle (dstMat, point, 5, new Scalar (0, 0, 255), -1);Imgproc.putText (dstMat, " " + returnVal, point, Core.FONT_HERSHEY_SIMPLEX, 0.4, new Scalar (0, 255, 0), 1, Imgproc.LINE_AA, false);}

遍历srcContours列表中的轮廓与srcContours[1]进行比较

srcContours数组index对应轮廓  

  • matchShapes (Mat contour1, Mat contour2, int method, double parameter)

contour1 第一个轮廓或者灰度图像

contour2第二个轮廓或者灰度图像

method 比较的方法CV_CONTOURS_MATCH_I1 , CV_CONTOURS_MATCH_I2 or CV_CONTOURS_MATCH_I3 (see the details below).

Parameter 方法的具体参数(暂不支持)

参考网址:

https://docs.opencv.org/2.4/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html?highlight=matchshapes#cv2.matchShapes

  • minEnclosingCircle (MatOfPoint2f points, Point center, float[] radius)

计算完全包围已有轮廓最小圆.

Points输入的二维点集

Point center表示输出的圆形的中心坐标,是float型

float[] radius 输出的最小圆半径,是float型

参考网址:

https://blog.csdn.net/qq_18343569/article/details/48000071?utm_source=blogxgwz1

https://blog.csdn.net/huanghuangjin/article/details/80896543

  • circle (Mat img, Point center, int radius, Scalar color, int thickness)

在图像上绘制一个圆形

img Mat对象,表示要在其上绘制圆的图像

Center 代表圆中心的Point对象

Radius 表示圆的半径的整型变量。

color 表示圆的颜色的标量对象(BGR)。

thickness 表示圆的厚度的整数; 默认情况下,厚度值为1。

参考网址:https://www.yiibai.com/opencv/opencv_drawing_circle.html

  • putText (Mat img, string text, Point org, int fontFace, double fontScale, Scalar color, int thickness, int lineType, bool bottomLeftOrigin)

在图像上绘制一个文字

Img Mat对象,表示要在其上绘制文字的图像

Text 文字(不支持中文)

Org 文字的位置

fontFace 字体 OpenCV支持的文字类型

fontScale 缩放

color 颜色

thickness 线宽度

lineType 限类型

bottomLeftOrigin (true)图像数据原点在左下角否则(false)在左上角

参考网址:

https://blog.csdn.net/guduruyu/article/details/68491211

https://blog.csdn.net/ubunfans/article/details/24421981

5 将图片内容赋给cube物体

Texture2D texture = new Texture2D (dstMat.cols (), dstMat.rows (), TextureFormat.RGBA32, false);
Utils.matToTexture2D (dstMat, texture);
gameObject.GetComponent<Renderer> ().material.mainTexture = texture;

将mat格式转换成Texture格式赋给cube的mianTexture


(๑′ᴗ‵๑)

OpenCVforUnity中的图片轮廓对比——MatchShapesExample案例相关推荐

  1. Python-OpenCV 处理图像(四)(五):图像直方图和反向投影 图像中边界和轮廓检测

    当我们想比较两张图片相似度的时候,可以使用这一节提到的技术 直方图对比 反向投影 关于这两种技术的原理可以参考我上面贴的链接,下面是示例的代码: 0x01. 绘制直方图 import cv2.cv a ...

  2. 数据分析中常用分析思路对比分析解析(一)

    对比是识别事物的基本方法对比--横向.纵向及多维度对比比值比率背后的逻辑指标的逻辑与管理指标对标的层次和维度标杆管理与榜样的力量. 4.1 对比是识别事物的基本方法 对比是最基本的数据分析方法,也是其 ...

  3. OpenCV中视频操作及人脸识别案例

    目录 OpenCV中视频操作及人脸识别案例 视频操作 视频读写 从文件中读取视频并播放 保存视频 小结 视频追踪 meanshift Camshift 算法总结 小结 案例:人脸案例 人脸识别基础 实 ...

  4. 计算机有效教学案例分析,中职计算机应用基础有效教学案例分析.doc

    中职计算机应用基础有效教学案例分析.doc (7页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.90 积分 俩瘫直词琼下矫焉原温沽己动府罚斗寒详沛凡 ...

  5. 科研绘图中的图片格式问题

    本文分析了所有主流图片格式的优缺点. 科研绘图中的图片格式问题 科研论文投稿需要根据期刊的要求上传符合要求的图片,以下为科研绘图中相关格式问题汇总. 1 位图和矢量图的区别 位图(Bitmap) 又称 ...

  6. div css布局中CSS图片大小自动按比例等比例缩小图片不变形解决技巧

    div css布局中CSS图片大小自动按比例等比例缩小图片不变形解决技巧 在DIV CSS布局中对于图片列表或图片排版时,图片不是固定宽度高度大小,但图片占位是固定宽度高度,这个时候如果使用CSS固定 ...

  7. div css布局中CSS图片大小自动按比例等比例缩小图片不变形解决技巧(转)

    本人对前端处理不是很牛,所以转载这文章.原文地址:http://www.divcss5.com/wenji/w632.shtml DIV CSS布局中对于图片列表或图片排版时,图片不是固定宽度高度大小 ...

  8. 2017年首份中美数据科学对比报告,Python受欢迎度排名第一,美国数据工作者年薪中位数高达11万美金

    最新消息,Kaggle最近对机器学习及数据科学领域进行了全行业深度调查,调查共收到超过 16,000 份回复,受访内容包括最受欢迎的编程语言是什么,不同国家数据科学家的平均年龄是什么,不同国家的平均年 ...

  9. 《淘宝店铺经营管理一册通》一一1.3 页面中的图片应用

    本节书摘来自异步社区出版社<淘宝店铺经营管理一册通>一书中的第1章,第1.3节,作者: 葛存山,更多章节内容可以访问云栖社区"异步社区"公众号查看. 1.3 页面中的图 ...

最新文章

  1. subplot subplots绘制子图
  2. 从用户需求看互联网基础设施服务商www.shzhenai.com
  3. 技巧/诀窍:在ASP.NET中重写URL
  4. SpringBoot学习笔记(一)整合Mybatis
  5. Windows下动态加载可执行代码原理简述
  6. 你今天怎么这么好看——基于深度学习的大型现场实时美颜
  7. 【error】Invalid ADAPTORNAME specified. Type 'imaqhwinfo' for a list of available ADAPTORNAMEs.
  8. 买iphone不买android,为何宁可用4年前的苹果6s,也不买两三千的安卓呢?理由很真实...
  9. Leetcode--1014. 最佳观光组合(java)
  10. B端产品经理需要着重锻炼自己这些能力
  11. TensorFlow2.0(五)--Keras构建Wide Deep模型
  12. tensorflow预测波士顿房价
  13. 小米路由linux系统,Linux下玩转小米路由器文件访问.docx
  14. jsp页面中文乱码解决方法
  15. 黑马程序员-学习日志-文件的合并
  16. CSDN是什么?——我的博客漫漫成长之路
  17. 数据技术大融合,HSTAP数据库有多少想象空间?
  18. ffmpeg-linux录音录像
  19. elasticsearch,spring boot,mybatis项目小结
  20. ft232h引脚_AM3356BZCZD60--越秀--回收各种内存IC

热门文章

  1. 微信小程序—千变万化的图片处理(canvas那些滤镜效果)
  2. 旅游科技公司常用的运维管理服务器工具
  3. 支付宝支付整体流程,包括验签【同步】【异步】
  4. 链表中倒数第k个结点——《剑指offer》
  5. C++模拟实现哈希表
  6. Python实现简易的信息管理系统
  7. java 打印日历
  8. 这是什么一个可以升级的系统 可为什么没有说明书 自己摸索 你玩儿我吧 一个得到了一套可以升级的军事系统的年轻人,以后路就应该坑到底
  9. 4. Linux - 输入子系统框架详解
  10. 计算机控制技术课程教学设计(10个)