使用C#版OpenCV进行圆心求取

栏目: ASP.NET · 发布时间: 6年前

内容简介:OpenCVSharp是OpenCV的.NET wrapper,是一名日本工程师开发的,项目地址为:https://github.com/shimat/opencvsharp。该源码是 BSD开放协议,BSD开源协议是一个给于使用者很大自由的协议。基本上使用者可以”为所欲为”,可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布或商业化销售。可以直接从上面的github上下载源码,自行编译引用;

OpenCVSharp是OpenCV的.NET wrapper,是一名日本工程师开发的,项目地址为:https://github.com/shimat/opencvsharp。

该源码是 BSD开放协议,BSD开源协议是一个给于使用者很大自由的协议。基本上使用者可以”为所欲为”,可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布或商业化销售。

1.OpenCVSharp的下载

可以直接从上面的github上下载源码,自行编译引用;

也可用vs中的nuget包管理器下载;

打开【工具】->【库程序包管理器】->【管理解决方案的NuGet程序包】,在其中搜索OpenCVSharp,选择合适的点击【安装】(最好安装最新的)。一直等待完成。 使用C#版OpenCV进行圆心求取

我的环境是vs2017,下载之后最好直接拷贝OpenCVSharp系列dll到项目中引用即可。

使用C#版OpenCV进行圆心求取

2.拟合圆并求取圆心

本次举例比较贴近实际,我们求如下原始图片的中间部分圆的圆心,选取的图片故意只留了一半:

使用C#版OpenCV进行圆心求取

源码如下:

using OpenCvSharp;

namespace SamplesWinform
{
    public class CircleFit 
    {
        public  void Run()
        {
            //读取图片
            var img = Cv2.ImRead("Data/Image/c1.bmp");
            //显示图片
            //Cv2.ImShow("Input Image", img);
            
            //转换成灰度图
            Mat gray = img.CvtColor(ColorConversionCodes.BGR2GRAY);
           
            //阈值二值化操作 阈值参数可以用一些可视化 工具 来调试得到
            Mat ThresholdImg = gray.Threshold(11, 255,  ThresholdTypes.Binary);
            Cv2.ImShow("Threshold", ThresholdImg);

            //降噪
            //方法一:高斯变化
            //Mat gaussImg= ThresholdImg.GaussianBlur(new Size(5, 5), 0.8);
            //Cv2.ImShow("GaussianBlur", gaussImg);
            //方法二:中值滤波降噪
            Mat medianImg = ThresholdImg.MedianBlur(5);
            Cv2.ImShow("MedianBlur", medianImg);

            //方法三:膨胀+腐蚀
            ////膨胀处理
            //Mat kernel = new Mat(15, 15, MatType.CV_8UC1);
            //Mat DilateImg = ThresholdImg.Dilate(kernel);
            ////腐蚀处理
            //Mat binary = DilateImg.Erode(kernel);
            ////显示中间结果
            //Cv2.ImShow("Dilate & Erode", binary);

            //设置感兴趣的区域
            int x = 150, y = 100, w = 294, h = 337;
            Rect roi = new Rect(x, y, w, h);
            Mat ROIimg = new Mat(medianImg, roi);
            //Cv2.ImShow("ROI Image", ROIimg);

            //寻找图像轮廓
            Point[][] contours;
            HierarchyIndex[] hierachy;
            Cv2.FindContours(ROIimg, out contours, out hierachy, RetrievalModes.List, ContourApproximationModes.ApproxTC89KCOS);
            //根据找到的轮廓点,拟合椭圆
            for (int i = 0; i < contours.Length; i++)
            {
                //拟合函数必须至少5个点,少于则不拟合
                if (contours[i].Length < 5) continue;
                //椭圆拟合
                var rrt = Cv2.FitEllipse(contours[i]);

                //ROI复原
                rrt.Center.X += x;
                rrt.Center.Y += y;

                //画椭圆
                Cv2.Ellipse(img, rrt, new Scalar(0, 0, 255), 2, LineTypes.AntiAlias);
                //画圆心
                Cv2.Circle(img, (int)(rrt.Center.X), (int)(rrt.Center.Y), 4, new Scalar(255, 0, 0), -1, LineTypes.Link8, 0);
            }
            
            Cv2.ImShow("Fit Circle", img);
        }


     }
}

中间处理过程效果图如下:

分别是阈值分割后,中值滤波后,拟合圆之后

使用C#版OpenCV进行圆心求取


以上所述就是小编给大家介绍的《使用C#版OpenCV进行圆心求取》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

Code

Code

Charles Petzold / Microsoft Press / 2000-10-21 / USD 29.99

Paperback Edition What do flashlights, the British invasion, black cats, and seesaws have to do with computers? In CODE, they show us the ingenious ways we manipulate language and invent new means of ......一起来看看 《Code》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

在线进制转换器
在线进制转换器

各进制数互转换器