【实战精选】基于OpenCV的果实检测与果径测算系统(源码&教程)

这篇具有很好参考价值的文章主要介绍了【实战精选】基于OpenCV的果实检测与果径测算系统(源码&教程)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.研究背景与意义

项目参考AAAI Association for the Advancement of Artificial Intelligence

研究背景与意义

随着农业技术的不断发展,果实的检测和测量对于果树种植和果实质量评估变得越来越重要。果实的检测和测量可以提供重要的信息,如果实的数量、大小、形状和颜色等,这些信息对于果树种植者和果实市场非常有价值。然而,传统的果实检测和测量方法通常需要大量的人力和时间,效率低下且容易出现误差。

近年来,计算机视觉技术的快速发展为果实检测和测量提供了新的解决方案。OpenCV是一个开源的计算机视觉库,具有丰富的图像处理和分析功能,可以用于开发各种视觉应用程序。基于OpenCV的果实检测与果径测算系统可以利用计算机视觉技术自动识别和测量果实,大大提高了果实检测和测量的效率和准确性。

该系统的研究意义主要体现在以下几个方面:

  1. 提高果实检测和测量的效率:传统的果实检测和测量方法通常需要人工操作,耗时且容易出现误差。基于OpenCV的果实检测与果径测算系统可以自动识别和测量果实,大大提高了检测和测量的效率,减少了人力成本。

  2. 提高果实检测和测量的准确性:基于OpenCV的果实检测与果径测算系统可以利用计算机视觉技术对果实进行精确的识别和测量,避免了人为因素对结果的影响,提高了检测和测量的准确性。

  3. 促进果实质量评估和品种改良:果实的数量、大小、形状和颜色等特征对于果实的质量评估和品种改良非常重要。基于OpenCV的果实检测与果径测算系统可以提供丰富的果实特征信息,为果树种植者和果实市场提供准确的果实质量评估和品种改良依据。

  4. 推动农业智能化发展:基于OpenCV的果实检测与果径测算系统是农业智能化发展的重要组成部分。该系统可以自动识别和测量果实,为果树种植者提供决策支持,提高果树种植的智能化水平。

总之,基于OpenCV的果实检测与果径测算系统具有重要的研究意义和应用价值。该系统可以提高果实检测和测量的效率和准确性,促进果实质量评估和品种改良,推动农业智能化发展。未来的研究可以进一步完善该系统的算法和功能,拓展其在果实检测和测量领域的应用。

2.图片演示

【实战精选】基于OpenCV的果实检测与果径测算系统(源码&教程),opencv,人工智能,计算机视觉
【实战精选】基于OpenCV的果实检测与果径测算系统(源码&教程),opencv,人工智能,计算机视觉
【实战精选】基于OpenCV的果实检测与果径测算系统(源码&教程),opencv,人工智能,计算机视觉

3.视频演示

基于OpenCV的果实检测与果径测算系统_哔哩哔哩_bilibili

4.硬件设计与搭建

视觉识别的信息都来自于图像,所以图像的采集和处理是视觉检测的基础。图像采集工作由光源、镜头、相机共同完成,清晰高质量的图像是视觉检测算法对图像处理分析的前提,故硬件系统的合理设计是极其重要的。

工业相机

工业相机和镜头是图像采集系统中的核心硬件,对柑橘边缘信息和表面信息提取的质量有着绝对的影响作用。
根据检测系统的设计要求,工业相机须及时采集到该工位的图像。根据翻转检测方法的设计思想,利用3台相机对每个柑橘进行三次图像采集,三张图像涵盖柑橘全表面的图像信息。故相机的视野尽量刚好可容纳单个柑橘,过大的视野增加了图像信息的复杂性,增加图像处理的难度。托辗之间工位宽度为114.3mm,由2.1.1小节可知柑橘果径范围在50mm到 85mm 之间,故相机检测的最小视野为85mm×85mm;考虑到机构加工以及装配带来的定位误差,相机的视野适当增大至 100mm×100mm。由《鲜柑橘》(GBT12947-2008)标准可知,果径的分级是以5mm为一分级区间,故其最低精度要求为5mm[31l,本文理论检测精度初步设定为0.5mm,取缺陷点最小面积为10个。
分辨率=缺陷点面积x优野汜出(长叹苋)=2000×2000精度
【实战精选】基于OpenCV的果实检测与果径测算系统(源码&教程),opencv,人工智能,计算机视觉

计算结果可知工业相机的最小分辨率要求为2000×2000,本文初步选择德国公司生产的Mako G-507C工业相机。相机详细参数如表所示,相机的分辨率、高传输速度以及性价比完全满足系统要求。
【实战精选】基于OpenCV的果实检测与果径测算系统(源码&教程),opencv,人工智能,计算机视觉

光学镜头是相机不可缺少的部分,其将物体的光学图像投射到相机CMOS靶面上。相机镜头的选择主要考虑CMOS传感器尺寸、视场范围、以及焦距。镜头的像场尺寸需大于等于相机的传感器尺寸。相机已经确定,故镜头靶面也确定。视场范围由物距来决定,故需确定镜头焦距。镜头成像光路原理如图所示,物距、相距以及焦距之间关系如式。
【实战精选】基于OpenCV的果实检测与果径测算系统(源码&教程),opencv,人工智能,计算机视觉

式中:f代表焦距,u代表物距,v代表相距。
【实战精选】基于OpenCV的果实检测与果径测算系统(源码&教程),opencv,人工智能,计算机视觉
另外,焦距、传感器尺寸、视场宽度以及工作距离之间有如下关系:
【实战精选】基于OpenCV的果实检测与果径测算系统(源码&教程),opencv,人工智能,计算机视觉

式中:D为工作距离,h为传感器尺寸,H为视场宽度。
由上文可知视野宽度为100mm,CMOS尺寸长约7mm,相机工作高度大约500mm,代入公式得f=35mm。基于以上计算分析可知焦距为35mm的Computer M3520-MPW2镜头可适配相机,镜头详细参数如表。
【实战精选】基于OpenCV的果实检测与果径测算系统(源码&教程),opencv,人工智能,计算机视觉
【实战精选】基于OpenCV的果实检测与果径测算系统(源码&教程),opencv,人工智能,计算机视觉

光源及打光方式实验分析

在图像采集中,外界自然光非常不稳定且不可控,光源的选择对成像质量有着至关重要的作用。适合的光源以及打光方式可增强图像的质量,突出检测对象特征及细节,增强检测目标与其背景的对比度;避免背景干扰,便于图像处理算法对检测对象的提取分析。不同的工作场景适用不同的照明方案,以降低噪声对目标的干扰。需针对实际工作场景进行多种光照实验来设计照明方案,最终达到最佳图像质量。
机器视觉中常用的光源主要为LED 灯、荧光灯、以及卤素灯,这些光源光线均匀明亮。本文视觉检测对象主要为柑橘的尺寸和其表面缺陷。需要图像质量优秀,边缘清晰,便于分割;呈现出来的图像色彩区分明显,便于辨别表皮上的缺陷。本文采用成本低、寿命长、稳定性好的LED条形灯管作为照明光源,纳秒级响应速度比其他光源更快,方便调节。如图4.4利用LED条形灯管搭建光学平台,利用纸板搭建封闭黑暗无光的空间,根据被检测物品进行打光实验。
【实战精选】基于OpenCV的果实检测与果径测算系统(源码&教程),opencv,人工智能,计算机视觉

光源打光方式对提高图像质量有至关重要的作用,需要针对检测目标选择合适的打光效果,在复杂工作环境中降低噪声突显出检测对象重要特征,并对不需要的特征进行抑制。前向照明和背向照明[32,33]是光照系统中最常见的打光方法。
本文的检测重点在于轮廓尺寸测量和柑橘表面信息;故不考虑背向照明的方式,采用前向照明。前向照明主要方式有直接照明和漫反射照明,将两种打光方式在光照实验平台上进行打光效果验证。经过打光方式实验分析发现,柑橘为类椭球形,四周边缘曲率较大且柑橘表面打蜡;直接照明采集的图像局部区域由于镜面反光而出现亮斑,其四周相比较暗,后续对柑橘表面缺陷特征信息的提取识别造成困难;如图实验所示,柑橘中心区域出现大片亮斑。而漫反射照明方式利用灯表面附有漫射板,使得LED灯发出的光线均匀柔和,如图实验所示,柑橘表面清晰,其光照效果均匀柔和,表面相较而言未出现明显的亮斑。由上综合可知,在实验分析柑橘光照成像的特性后,从照明强度、目标对比度、均匀性及鲁棒性等方面考虑后,本文采用LED灯带作为光源,在漫射照明的打光方式下对柑橘进行图像采集,避免后续图像处理算法的复杂性。
【实战精选】基于OpenCV的果实检测与果径测算系统(源码&教程),opencv,人工智能,计算机视觉

5.核心代码讲解

5.1 contours_d.py

根据代码中的功能,可以将其封装为一个名为FruitAnalyzer的类。该类包含以下方法:



class FruitAnalyzer:
    def __init__(self, image_path):
        self.image_path = image_path

    def find_contours(self, edges):
        """查找并返回边缘检测后的轮廓"""
        contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
        return contours

    def measure_diameter(self, contours):
        """测量并返回果实直径"""
        diameters = []
        for contour in contours:
            if cv2.contourArea(contour) > 100:  # 过滤掉小轮廓
                (x, y), radius = cv2.minEnclosingCircle(contour)
                diameters.append(radius * 2)  # 计算直径
        return diameters

    def analyze(self):
        image = cv2.imread(self.image_path)
        segmented_image = segment_image(image)
        edges = detect_edges(segmented_image)
        contours = self.find_contours(edges)
        diameters = self.measure_diameter(contours)

        print(f"Diameters: {diameters}")

        # 可选:显示处理后的图像
        cv2.imshow('Segmented Image', segmented_image)
        cv2.imshow('Edges', edges)
        cv2.waitKey(0)
        cv2.destroyAllWindows()

这个程序文件名为contours_d.py,主要功能是对水果图像进行边缘检测并测量果实的直径。

程序首先导入了cv2模块,以及两个自定义的模块image_processingedge_detection

接下来定义了一个find_contours函数,用于查找并返回边缘检测后的轮廓。该函数使用cv2.findContours函数来查找轮廓,其中edges参数是经过边缘检测后的图像。

然后定义了一个measure_diameter函数,用于测量并返回果实的直径。该函数遍历每个轮廓,如果轮廓的面积大于100,则使用cv2.minEnclosingCircle函数找到轮廓的最小外接圆,并计算直径。

接下来定义了一个main函数,用于执行主要的图像处理流程。首先读取图像文件路径,然后使用cv2.imread函数读取图像。接着调用segment_image函数对图像进行分割处理,得到分割后的图像。然后使用detect_edges函数对分割后的图像进行边缘检测,得到边缘图像。接着调用find_contours函数查找边缘图像中的轮廓。最后调用measure_diameter函数测量轮廓的直径,并将结果打印出来。

最后,程序可选地显示处理后的图像。使用cv2.imshow函数显示分割后的图像和边缘图像,然后使用cv2.waitKey函数等待用户按下键盘任意键,最后使用cv2.destroyAllWindows函数关闭显示窗口。

最后,通过if __name__ == "__main__":判断是否直接运行该文件,如果是,则调用main函数执行主要的图像处理流程。

5.2 edge_detection.py

class EdgeDetector:
    def __init__(self):
        self.blurred_image = None
        self.edges = None

    def detect_edges(self, image):
        """使用Canny算子进行边缘检测"""
        self.blurred_image = cv2.GaussianBlur(image, (5, 5), 0)
        self.edges = cv2.Canny(self.blurred_image, 50, 150)
        return self.edges

这个程序文件名为edge_detection.py,它使用了OpenCV库来进行边缘检测。其中定义了一个名为detect_edges的函数,该函数接受一个图像作为输入,并使用Canny算子进行边缘检测。在函数内部,首先对输入图像进行高斯模糊处理,然后使用Canny算子检测边缘。最后,返回检测到的边缘图像。

5.3 image_processing.py

class ImageSegmentation:
    def __init__(self):
        pass

    def convert_to_lab(self, image):
        """将图像从BGR转换到LAB颜色空间"""
        return cv2.cvtColor(image, cv2.COLOR_BGR2LAB)

    def segment_image(self, image):
        """基于像素点的图像分割方法"""
        lab_image = self.convert_to_lab(image)
        l_channel, a_channel, b_channel = cv2.split(lab_image)
        # 使用L分量进行阈值分割
        _, l_thresh = cv2.threshold(l_channel, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
        return l_thresh

这个程序文件名为image_processing.py,它包含了两个函数。

第一个函数是convert_to_lab,它的作用是将图像从BGR颜色空间转换到LAB颜色空间。它使用了OpenCV库中的cvtColor函数,将输入的图像转换为LAB颜色空间。

第二个函数是segment_image,它是基于像素点的图像分割方法。首先,它调用了convert_to_lab函数将输入的图像转换为LAB颜色空间。然后,它将LAB图像分离成L、A和B三个通道。接下来,它使用L分量进行阈值分割,通过调用OpenCV库中的threshold函数,将L分量进行二值化处理。最后,它返回二值化后的图像。

这个程序文件主要用于图像处理,其中的segment_image函数可以用于对图像进行分割处理。

5.4 ui.py


class FruitContourDetection:
    def __init__(self, image_path):
        self.image_path = image_path

    def contour_area_filter(self, threshold=10000):
        img = cv2.imread(self.image_path)
        output = img.copy()

        blur = cv2.blur(img, (5, 5))
        gray = cv2.cvtColor(blur, cv2.COLOR_BGR2GRAY)
        ret, binary = cv2.threshold(gray, 220, 255, cv2.THRESH_BINARY_INV)

        contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

        large_contours = 0
        ......

这个程序文件是一个使用PyQt5库编写的图形用户界面程序。它的主要功能是对输入的图像进行轮廓提取和筛选,并在界面上显示处理后的图像和相关信息。

程序文件中定义了一个名为Ui_MainWindow的类,该类继承自object类,并实现了一个名为setupUi的方法,用于设置程序界面的布局和样式。在setupUi方法中,通过调用PyQt5库的相关类和方法,创建了一个主窗口和一些标签、按钮等控件,并设置了它们的位置、样式和事件处理函数。

程序文件还定义了一些辅助函数,如contour_area_filter函数用于对图像进行轮廓提取和筛选,cv2_to_pilpil_to_cv2函数用于在OpenCV图像和PIL图像之间进行转换,draw_text_on_pil_image函数用于在PIL图像上绘制文本。

程序文件中还定义了一个名为Thread_1的线程类,用于在后台处理图像。该线程类继承自QThread类,并重写了run方法,用于执行图像处理的相关函数。

在程序的主函数中,创建了一个QApplication对象和一个QMainWindow对象,并将其传递给Ui_MainWindow类的实例对象进行初始化。然后,调用show方法显示主窗口,并通过调用app.exec_()方法进入主循环,等待用户交互事件的发生。

总之,这个程序文件是一个使用PyQt5库编写的图形用户界面程序,主要用于对输入的图像进行轮廓提取和筛选,并在界面上显示处理后的图像和相关信息。

6.系统整体结构

整体功能和构架概述:

该程序是一个基于OpenCV的果实检测与果径测算系统,通过图像处理和边缘检测技术,对输入的果实图像进行处理和分析,并在图形用户界面上显示处理结果和相关信息。

程序文件功能概述:

文件名 功能概述
contours_d.py 对水果图像进行边缘检测并测量果实的直径
edge_detection.py 进行边缘检测,使用Canny算子对图像进行边缘检测
image_processing.py 包含图像处理函数,包括将图像转换到LAB颜色空间和图像分割处理
ui.py 使用PyQt5库编写的图形用户界面程序,用于显示处理后的图像和相关信息,以及与用户交互

请注意,以上是根据文件名和代码分析所得的概述,具体的功能和实现可能还需要进一步的代码分析和理解。

7.图像预处理

图像采集的质量会因某些因素的影响产生质量的退化,甚至掩盖图像重要特征,因此需对原始图像进行矫正等预处理,便于后续处理。
图像增强是预处理的重要组成部分,复杂的背景对目标图像分割产生严重干扰。图像增强可突显目标图像区域与背景的区别,便于图像分割。本文中托辐及其他机构的某些部分在图像中与柑橘边缘灰度值相近,导致利用阈值分割时柑橘边缘与背景交杂难以区分,强行分割会丢失部分边缘信息(图)。目前常用的图像增强方法主要为灰度变换和直方图均衡化。
【实战精选】基于OpenCV的果实检测与果径测算系统(源码&教程),opencv,人工智能,计算机视觉

线性灰度变换

灰度变换处理是图像增强算法中基础的处理技术,该技术将图像每个像素点的灰度值以凸显感兴趣对象的变换关系进行修改。拉伸图像的对比度,使得图像动态范围增大,目标特征更加清晰。数学原理如下所示:
【实战精选】基于OpenCV的果实检测与果径测算系统(源码&教程),opencv,人工智能,计算机视觉

其中:kb-a’la,b]为初始图像f(xy)的灰度范围,[c,d]为变换后g(xy)扩展的灰度值;为了扩大动态范围,增大对比度,令k>1。

直方图均衡化

直方图为图像的灰度分布数据统计图。直方图均衡化的原理是对原始图像直方图变换,使得灰度直方图趋于均匀;使得原图中相近灰度且像素点数量占比大的区域的灰度级范围扩大,从而增加像素点灰度值动态范围,使得区域中细小灰度变化体现出来,图像更加清晰[3]。直方图均衡化的变换函数公式如下:
【实战精选】基于OpenCV的果实检测与果径测算系统(源码&教程),opencv,人工智能,计算机视觉

式中: s是输出图像的灰度级,MN为像素。
两种算法应用于图像的实际增强效果如图所示。由图中可以看出线性灰度变换明显提升整体亮度﹐柑橘与托辗(背景)的对比明显,但是亮度增强不均匀,局部边缘较暗。
【实战精选】基于OpenCV的果实检测与果径测算系统(源码&教程),opencv,人工智能,计算机视觉

如图,直方图均衡化均匀修正原始直方图,明显提升图像亮度,增强整体对比度。且从图实验效果看出柑橘表面亮度均匀,其边缘光照补偿效果明显且清晰,故本文以直方图均衡化来进行增强图像。
【实战精选】基于OpenCV的果实检测与果径测算系统(源码&教程),opencv,人工智能,计算机视觉

8.目标图像提取

检测目标实际是图片的局部区域,须将感兴趣的局部区域从背景中分割出来以缩小检测范围。经过上文预处理后,图像中目标区域与背景区域之间存在比较明显的差异,图像分割以一定标准可将图像区域分割为若干个互不重叠的区域。阈值处理由于其处理速度快、算法简单的特点,成为最广泛使用的图像分割算法。灰度阈值分割常用双阈值分割、OTSU分割等方法。
双阈值分割原理是利用图像不同区域像素灰度值差异,依据多个合理阈值将图像中像素点区分到适合的类别中,其基本原理如下:
【实战精选】基于OpenCV的果实检测与果径测算系统(源码&教程),opencv,人工智能,计算机视觉

式中: a,b,c为三个任意不同的灰度值,T和T为根据直方图特点设置的两个阈值。OTSU分割法也称最大类间方差法。依据图像的灰度特性,利用统计学计算出适当阈值使得前景和背景的类间方差最大,从而将图像前景与背景分开成两部分,其基本原理如下[5]:
设N为原始图像的像素总数,n为i灰度值的像素数量,[0,L-1]为i灰度级范围,则像素总数为:

【实战精选】基于OpenCV的果实检测与果径测算系统(源码&教程),opencv,人工智能,计算机视觉
两种算法应用于图像的阈值分割效果如图4.10所示。根据多次实验调试,双阈值分割阈值T、Tz设置为27和248。OTSU分割算法阈值根据图像自动计算,提取出较亮的区域。从实验效果图中可以看出两种算法成功地分离出柑橘与其他环境背景,但是固定阈值缺乏严谨性:连续的采图过程中,图像灰度动态变化,导致固定阈值分割存在误差。OTSU分割法分离出的柑橘区域完整,图像边缘的信息连续性好。故本文采用OTSU分割算法进行柑橘与背景的分离。
【实战精选】基于OpenCV的果实检测与果径测算系统(源码&教程),opencv,人工智能,计算机视觉

由上图可看出,仅采用阈值分割的效果还未完全将柑橘提取出来,还须结合一些形态学处理方法进行提取。经过OTSU阈值分割后,如图,图像被分成若干具有不同特征值的区域。如图 (b),本文依据面积特征来筛选出较大的前景目标,将柑橘以外的杂点排除。
【实战精选】基于OpenCV的果实检测与果径测算系统(源码&教程),opencv,人工智能,计算机视觉

如图提取出的前景目标区域可能存在空洞,对其区域进行孔洞填充。孔洞填充为形态学处理常用的方法,其作用为对封闭但有空洞的区域进行填充,基本原理如下;
【实战精选】基于OpenCV的果实检测与果径测算系统(源码&教程),opencv,人工智能,计算机视觉

式中:B为结构元素,A为8连通边界组成的集合,X:为像素点。
【实战精选】基于OpenCV的果实检测与果径测算系统(源码&教程),opencv,人工智能,计算机视觉

经过一些形态学处理后的区域基本为柑橘所在区域,可能会丢失一部分边缘区域,对后续尺寸检测精度造成影响。故对该区域进行适当扩展以保证柑橘边缘被包含在内。可利用形态学膨胀算法对其扩展,膨胀效果如图(a)。其原理定义如下[6];
【实战精选】基于OpenCV的果实检测与果径测算系统(源码&教程),opencv,人工智能,计算机视觉

通过预处理以及图像分割处理后得到完美的柑橘区域,最后依据区域对原图进行裁剪,如图(b)得到柑橘检测范围。
【实战精选】基于OpenCV的果实检测与果径测算系统(源码&教程),opencv,人工智能,计算机视觉

9.图像标定方法

柑橘尺寸测量算法得出的是柑橘的像素尺寸,须先通过相机标定确定其像素尺寸与实际物理尺寸换算关系,以根据柑橘所占像素计算出柑橘实际尺寸。图像标定原理就是图像坐标系、相机坐标系以及世界坐标系之间的转化得到投影矩阵[37,确定相机内参和外参,最后得到像素点与物理尺寸的比例关系。
根据标定原理利用已知参数的标准标定板和其不同角度成像的特征点坐标,相当于已知世界坐标系和图像坐标系的坐标来求解相机的内外参数。
【实战精选】基于OpenCV的果实检测与果径测算系统(源码&教程),opencv,人工智能,计算机视觉

在标定过程中,以柑橘重心所在的平面作为基准。如图,本文采用7*7个圆点的10×10mm标定板。在相机下通过对多个位置及角度的标定板进行标定,最终得出相机内参和外参。标定过程如图所示,根据相机内参和外参可算出像素当量。像素当量表示的是该图像中每个像素点象征的物理尺寸。本文相机标定的像素当量K为0.042mm/pixel。
【实战精选】基于OpenCV的果实检测与果径测算系统(源码&教程),opencv,人工智能,计算机视觉

柑橘的大小通常以果径或者质量为衡量指标,本文依据《鲜柑橘》(GBT12947-2008)的规定,以柑橘果径为标准。目前通过视觉检测果径的算法有很多研究成果,主要有最小外接矩形法、投影面积计算法以及轮廓拟合法等研究思路。
最小外接矩形法原理为通过算法求取柑橘图像的最小外接矩形,如图该区域边缘与柑橘图像接触且完全包含。矩形的长宽近似能表达柑橘的大小,其长边近似为柑橘最大果径。该算法适用于规则物体,简单准确;但通过此种算法测量柑橘果径误差达到1.30mm,平均相对误差达到1.35%[10]。
【实战精选】基于OpenCV的果实检测与果径测算系统(源码&教程),opencv,人工智能,计算机视觉

如图所示,投影面积计算法原理为提取柑橘投影区域像素并进行标定测量得其实际面积,再利用圆形面积公式D=√4S÷n求出其直径大小,即用近似直径表示果径大小。此算法原理仅适用于规则的圆形水果,对于形状不规则且有缺陷的水果来说存在很大误差1。例如本文近似椭圆形的宽皮柑橘来说,该方法难以满足精度要求。
【实战精选】基于OpenCV的果实检测与果径测算系统(源码&教程),opencv,人工智能,计算机视觉

以20个柑橘为样本对三种方法进行试验,对比上文三种方法,由表可知轮廓拟合法测量误差最小。故本文利用轮廓拟合的原理进行柑橘果径的测量。但轮廓拟合法利用的传统边缘检测,只是像素级轮廓的粗定位。像素是相机成像图片的最小单位,图像由若干像素连接而成;但在微观上还有更小的像素单位存在,其为比像素精度更高的亚像素。而在此基础上进行亚像素级边缘提取的精度更高,其精度能达到0.1~0.5个像素[2]。故本文采用基于亚像素的轮廓拟合法,其基本流程为:首先对分割出来的柑橘进行边缘检测粗定位,然后提取亚像素边缘,最后对亚像素边缘进行拟合得到尺寸信息。
【实战精选】基于OpenCV的果实检测与果径测算系统(源码&教程),opencv,人工智能,计算机视觉

为了方便边缘的提取,减少其他部分表面信息对边缘提取的干扰,如图首先利用边界提取将边缘部分区域分割出来,该图像只留下边缘信息。其原理定义如下:
【实战精选】基于OpenCV的果实检测与果径测算系统(源码&教程),opencv,人工智能,计算机视觉

式中:B为适当的结构元。
【实战精选】基于OpenCV的果实检测与果径测算系统(源码&教程),opencv,人工智能,计算机视觉

边缘为区域与区域交界的地方,其图像特征必定发生变化。边缘检测实质就是寻找局部特征突变的区域。如图4.20柑橘直线上的两处边缘,其灰度值在两处发生剧烈变化,边缘灰度值一阶导数的最大值和最小值处即为柑橘边缘处。
【实战精选】基于OpenCV的果实检测与果径测算系统(源码&教程),opencv,人工智能,计算机视觉

用于像素级边缘点粗定位的常规算法有Roberts算子、Sobel算子、Prewitt 算子以及Canny 算子等。Roberts 、 Sobel 、Prewitt算子原理为一阶微分算子[3],对于边缘像素定位较准,但提取的边缘信息有所缺失。Canny算子在减弱边缘噪声的基础上保留高质量边缘信息,其边缘提取能力较优,成为边缘提取中应用最多的检测算子之一[42.44,45]。故本文采用Canny 算子对柑橘进行像素级边缘定位。该算子基本思想为:利用高斯滤波器平滑抑制噪声,通过一阶偏导计算边缘的梯度的幅值及方向,对幅值进行非极大值抑制以细化边缘,双阈值将边缘像素连成轮廓。Canny算子提取柑橘像素级边缘效果如图4.21(a)。
【实战精选】基于OpenCV的果实检测与果径测算系统(源码&教程),opencv,人工智能,计算机视觉

10.系统整合

下图完整源码&环境部署视频教程&自定义UI界面

【实战精选】基于OpenCV的果实检测与果径测算系统(源码&教程),opencv,人工智能,计算机视觉

参考博客《基于OpenCV的果实检测与果径测算系统》

11.参考文献


[1]朱森荣,刘杰徽.基于最小二乘法椭圆拟合的改进型快速算法[J].舰船电子工程.2022,42(1).DOI:10.3969/j.issn.1672-9730.2022.01.008 .

[2]孙荣荣,宋健宇,张明,等.中国柑橘外部品质机器视觉检测分级技术研究现状与展望[J].农业工程.2019,(1).

[3]戴宗贤,莫洪波,周勇,等.基于灰度的亚像素插值视觉测量方法[J].中国测试.2019,(5).DOI:10.11857/j.issn.1674-5124.2018030114 .

[4]刘琳,陈红,李磊,等.基于机械损伤的宽皮柑橘贮藏期间力学特性研究[J].湖北农业科学.2019,(15).DOI:10.14088/j.cnki.issn0439-8114.2019.15.029 .

[5]龚中良,杨张鹏,梁力,等.基于机器视觉的柑橘表面缺陷检测[J].江苏农业科学.2019,(7).DOI:10.15889/j.issn.1002-1302.2019.07.056 .

[6]陈红,尹伊君,潘海兵,等.宽皮柑橘机械损伤致损因素分析及缓冲减损防护措施[J].农业工程学报.2018,(1).DOI:10.11975/j.issn.1002-6819.2018.01.035 .

[7]舒启林,山博.改进canny算子的亚像素定位算法[J].机械设计与制造.2018,(10).DOI:10.3969/j.issn.1001-3997.2018.10.043 .

[8]钱振奇,王战中,杜小强.基于HALCON的单目视觉标定研究[J].石家庄铁道大学学报(自然科学版).2018,(3).DOI:10.13319/j.cnki.sjztddxxbzrb.2018.03.12 .

[9]高一佳.ADAMS中的接触和接触摩擦作用机制实例详解[J].汽车实用技术.2017,(6).DOI:10.16638/j.cnki.1671-7988.2017.06.020 .

[10]陈若珠,孙岳.基于最小二乘法的椭圆拟合改进算法研究[J].工业仪表与自动化装置.2017,(2).文章来源地址https://www.toymoban.com/news/detail-754214.html

到了这里,关于【实战精选】基于OpenCV的果实检测与果径测算系统(源码&教程)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包