OpenCVForUnity边缘检测(梯度)与滤波
2018-02-05 16:11
423 查看
OpenCV中,和边缘检测相关的算子有索贝尔,拉普拉斯滤波,Canny,Scharr等,另外还有一些解决特定问题的算子。这次的实例,尝试使用多种算子,对图片进行边缘提取。
public class gradient : MonoBehaviour { [SerializeField] private Image sobelImage, laplaceImage, cannyImage; Mat grayMat = new Mat(); Mat dstMat = new Mat(); void Start() { grayMat = Imgcodecs.imread(Application.dataPath + "/Textures/kizuna.jpg", 0); //读取为灰度 sobelImage.sprite = SobelGradient(); sobelImage.preserveAspect = true; laplaceImage.sprite = LaplaceGradient(); laplaceImage.preserveAspect = true; cannyImage.sprite = CannyGradient(); cannyImage.preserveAspect = true; } //索贝尔滤波 public Sprite SobelGradient() { Mat grad_x = new Mat(); Mat grad_y = new Mat(); Mat abs_grad_x = new Mat(); Mat abs_grad_y = new Mat(); // 计算水平方向梯度 Imgproc.Sobel(grayMat, grad_x, CvType.CV_16S, 1, 0, 3, 1, 0); // 计算垂直方向梯度 Imgproc.Sobel(grayMat, grad_y, CvType.CV_16S, 0, 1, 3, 1, 0); // 计算两个方向上的梯度的绝对值 Core.convertScaleAbs(grad_x, abs_grad_x); Core.convertScaleAbs(grad_y, abs_grad_y); // 计算结果梯度 Core.addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 1, dstMat); // Mat转Texture2D Texture2D t2d = new Texture2D(dstMat.cols(), dstMat.rows()); Utils.matToTexture2D(dstMat, t2d); Sprite sp = Sprite.Create(t2d, new UnityEngine.Rect(0, 0, t2d.width, t2d.height), Vector2.zero); return sp; } //拉普拉斯滤波 public Sprite LaplaceGradient() { Mat dst = new Mat(); int scale = 1; int delta = 0; int ddepth = CvType.CV_16S; int kernel_size = 3; Imgproc.Laplacian(grayMat, dst, ddepth, kernel_size, scale, delta, Core.BORDER_DEFAULT); Core.convertScaleAbs(dst, dstMat); // Mat转Texture2D Texture2D t2d = new Texture2D(dstMat.cols(), dstMat.rows()); Utils.matToTexture2D(dstMat, t2d); Sprite sp = Sprite.Create(t2d, new UnityEngine.Rect(0, 0, t2d.width, t2d.height), Vector2.zero); return sp; } //Canny滤波 public Sprite CannyGradient() { Mat edge = new Mat(); double threshold1 = 0; double threshold2 = 100; Imgproc.blur(grayMat, edge, new Size(3, 3)); Imgproc.Canny(edge, edge, threshold1, threshold2); Core.convertScaleAbs(edge, dstMat); // Mat转Texture2D Texture2D t2d = new Texture2D(dstMat.cols(), dstMat.rows()); Utils.matToTexture2D(dstMat, t2d); Sprite sp = Sprite.Create(t2d, new UnityEngine.Rect(0, 0, t2d.width, t2d.height), Vector2.zero); return sp; } }
最终效果
相关文章推荐
- 题目:opencv下对图像进行图像模糊(均值滤波)处理和边缘检测
- OpenCV2马拉松第16圈——边缘检测(形态学梯度)
- OpenCV 2 学习笔记(24): 使用形态学滤波检测边缘与角点
- 【OpenCV】边缘检测:梯度,sobel算子的理解
- 【OpenCV】边缘检测、梯度计算 Sobel Mat
- opencv for python (16)canny边缘检测原理及用滑动条设置阈值进行canny边缘检测
- Python下opencv使用笔记(七)(图像梯度与边缘检测)
- 【OpenCV】边缘检测:梯度,sobel算子的理解
- opencv(十三)--边缘检测和梯度
- OpenCV从入门到放弃(八):空间滤波与边缘检测
- Unity之梯度应用实现Roberts、Prewitt、Sobel边缘检测
- Python语言opencv使用笔记(七)(图像梯度与边缘检测)
- 实时检测图像中的主要边缘 opencv for Android
- OpenCV自学笔记3:Canny边缘检测
- 【opencv学习之二十六】边缘检测算子:Canny,Sobel,Laplacian
- 【OpenCV学习笔记】2.3图像的腐蚀、膨胀、模糊、边缘检测
- OpenCV参考手册之Canny边缘检测
- 【OpenCV入门指南】第三篇Canny边缘检测
- OpenCV 摄像头Canny边缘检测 (python)