Emgucv实现高拍仪功能(三)——投影切割

本文介绍了使用Emgucv进行图像切割的方法,主要通过水平和垂直投影找到切割边界,形成矩形区域。虽然适用于标准数字图像,但在处理非标准行间距时可能不够完善。博主分享了实现过程及QQ联系方式,旨在促进交流与合作。
摘要由CSDN通过智能技术生成

零碎的切割,适合标准的数字图像。帮人写的所以没太强化(分割的时候没设置正常行间距的阈值,后期也懒的判断矩形是否能合并 ),知识点也就是C#下的BitmapData的运用。思路:先做水平投影,通过像素的变换,找到上下两条线,同样方法做垂直投影,找到左右两条线,然后圈出矩形。

 


        private void btnCutAuto_Click(object sender, EventArgs e)
        {
            bool flag = false;
            //原图
            if (this.imageBox1.Image != null)
            {
                srcImage = new Image<Bgr, byte>(this.imageBox1.Image.Bitmap);
            }

            Image<Gray, byte> grayImage = srcImage.Convert<Gray, byte>().ThresholdBinary(new Gray(196d),new Gray(255d));

            //图片的水平投影,横向累计,纵向排列
            int[] warray = ToProjection_W(grayImage.Bitmap);
            int[] harray = ToProjection_H(grayImage.Bitmap);

            List&
C# 使用 EmguCV实现双目测距的基本步骤涉及图像捕捉、立体匹配和深度图生成等几个关键环节。 ### 1. 图像捕捉 首先需要从两个摄像头捕获图像,这两个摄像头应该放置在固定的距离上,并尽可能平行对准同一场景区域。这通常涉及到驱动摄像头硬件并获取图像数据。 ```csharp using Emgu.CV; using Emgu.CV.CvEnum; // 初始化视频设备(摄像头) var capture = new VideoCapture(0); // 可能需要根据实际情况调整索引 while (true) { // 获取图像帧 var image = capture.QueryFrame(); if (image != null) { // 进行后续处理前显示图像 Console.WriteLine("Captured frame"); image.Show("Camera View"); // 按特定键退出循环 if (Console.KeyAvailable && Console.ReadKey().Key == ConsoleKey.Q) break; } } capture.Close(); ``` ### 2. 立体匹配算法 使用 EmguCV 实现双目视觉系统的关键是找到两幅图像之间的对应点,即左右摄像头视角下同一物体的不同投影。这个过程可以采用 SGBM( Stereo Block Matching Algorithm)、SSD( Sum of Squared Differences)等多种算法。 ```csharp using Emgu.CV.Structure; using Emgu.CV.Stereo; using Emgu.CV.Util; int windowSize = 5; // 调整窗口大小以优化精度与速度的平衡 StereoBM stereoMatcher = new StereoBM(windowSize, 16); Mat disparityMap = new Mat(); // 假设我们已经有了两个图像 leftImage 和 rightImage stereoMatcher.Compute(leftImage, rightImage, disparityMap); // 显示匹配结果,这里展示的是“disparity map”,表示每个像素到最近平面的距离 disparityMap.Show("Disparity Map"); ``` ### 3. 深度图生成 从 disparity map 中提取深度信息,进而计算出各个点相对于相机系统的距离。 ```csharp public double DepthInMeter(int row, int col, double baseline) { double disp = disparityMap.Get<float>(row, col) / 16f; return baseline * focalLength / (disp + 1e-9); } double baseline = ...; // 需要测量的两个摄像头间的物理基线长度 double focalLength = ...; // 相机内参中的焦距 for (int i = 0; i < disparityMap.Height; i++) { for (int j = 0; j < disparityMap.Width; j++) { double depth = DepthInMeter(i, j, baseline); Console.WriteLine($"Depth at ({j}, {i}): {depth} meters"); } } ``` ### 4. 结果应用 最后,基于上述步骤得到的深度信息,可以进行物体定位、尺寸测量等进一步的应用分析。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值