Image processing OpenCV对象检测-中心点

Image processing OpenCV对象检测-中心点,image-processing,opencv,object-detection,Image Processing,Opencv,Object Detection,给定一个纯白色背景上的对象,有人知道OpenCV是否提供了从捕获的帧中轻松检测对象的功能吗 我试图定位对象(矩形)的角点/中心点。我目前的做法是用蛮力(扫描图像中的物体)而不是精确的。我想知道引擎盖下是否有我不知道的功能 编辑详细信息: 大小和一个小苏打罐差不多。摄影机位于对象上方,使其具有2D/矩形的感觉。相机的方向/角度是随机的,由角点计算得出 它只是一个白色背景,上面有物体(黑色)。拍摄的质量与您期望从Logitech网络摄像头中看到的一样 一旦我得到角点,我计算中心。然后将中心点转换为厘

给定一个纯白色背景上的对象,有人知道OpenCV是否提供了从捕获的帧中轻松检测对象的功能吗

我试图定位对象(矩形)的角点/中心点。我目前的做法是用蛮力(扫描图像中的物体)而不是精确的。我想知道引擎盖下是否有我不知道的功能

编辑详细信息: 大小和一个小苏打罐差不多。摄影机位于对象上方,使其具有2D/矩形的感觉。相机的方向/角度是随机的,由角点计算得出

它只是一个白色背景,上面有物体(黑色)。拍摄的质量与您期望从Logitech网络摄像头中看到的一样

一旦我得到角点,我计算中心。然后将中心点转换为厘米


我一直在努力完善我如何获得这四个弯角。您可以通过以下图像看到我的暴力方法:

在其他机器视觉库中通常称为blob分析。我还没有使用opencv。

opencv有很多函数可以帮助您实现这一点。如果您正在使用C#NET语言编程,请下载Emgu.CV以获取打包到库中的C#NET

获得您想要的东西的一些方法:

  • 像以前一样查找角点-例如“CornerHarris”OpenCV函数

  • 设置图像阈值并计算重心-请参阅。。。这是我将使用的方法。您甚至可以在COG例程中执行阈值设置。i、 e.cog_x+=*成像PTR<128?255 : 0;

  • 找到图像的力矩以提供旋转、重心等-例如“力矩”OpenCV函数。(我没用过这个)

  • (编辑)AForge.NET库具有角点检测功能以及一个示例项目(MotionDetector)和连接到网络摄像头的库。我认为这是最简单的方法,假设你使用的是Windows和.NET


  • 已经有一个例子说明了如何在OpenCV中进行矩形检测(look in samples/squares.c),实际上非常简单

    以下是他们使用的粗略算法:

    0. rectangles <- {}
    1. image <- load image
    2. for every channel:
    2.1  image_canny <- apply canny edge detector to this channel
    2.2  for threshold in bunch_of_increasing_thresholds:
    2.2.1   image_thresholds[threshold] <- apply threshold to this channel
    2.3  for each contour found in {image_canny} U image_thresholds:
    2.3.1   Approximate contour with polygons
    2.3.2   if the approximation has four corners and the angles are close to 90 degrees.
    2.3.2.1    rectangles <- rectangles U {contour}
    

    0。矩形希望这有帮助,使用矩量法获得黑白图像的质心

    cv::Point getCentroid(cv::Mat img)
    {
        cv::Point Coord;
        cv::Moments mm = cv::moments(img,false);
        double moment10 = mm.m10;
        double moment01 = mm.m01;
        double moment00 = mm.m00;
        Coord.x = int(moment10 / moment00);
        Coord.y = int(moment01 / moment00);
        return Coord;
    }
    

    由于没有人发布完整的OpenCV解决方案,因此这里有一个简单的方法:

  • 获取二值图像。我们加载图像,转换为灰度,然后使用

  • 查找外轮廓。我们使用
    findContours
    查找轮廓,然后使用
    boundingRect

  • 找到中心坐标。既然我们有了轮廓,我们就可以通过提取轮廓的质心来找到中心坐标


  • 下面是一个以绿色突出显示边界框和中心点的示例

    输入图像
    ->
    输出


    因此,总结一下:

    给定一个纯白色背景上的对象,有人知道OpenCV是否提供了从捕获的帧中轻松检测对象的功能吗

    首先获取二值图像(、、或),然后使用查找轮廓。要获取边界矩形坐标,可以使用,它将以
    x,y,w,h
    的形式提供坐标。要绘制矩形,可以使用。这将为您提供轮廓的4个角点。如果要获得中心点,请使用 提取轮廓的质心的步骤

    代码


    关于CVD,你能详细说明一下它是如何使用的吗?根据我所看到的,您创建一个图像并运行cvCornerHarris(图像、cornerimg、块大小(?)和光圈大小(?)。还有,你是如何从角图像中提取信息的?从我可以看出,它的工作方式是对每个像素运行一个大小为“apertureSize”的sobel边缘检测器,通过“blockSize”像素组对周围的“blockSize”进行检测。然后,它使用公式对在该区域检测到的边缘进行评分。角点将具有水平和垂直。生成的图像与原始图像大小相同,但最亮的像素对应。到最坚固的角落。选择大于要检测的角的块大小-为您的图像尝试5或7。选择光圈大小和稍微小一点-尝试3。我自己还没有使用过这个函数,所以说我正在做一个类似的项目。我是OpenCV新手,请您发布执行这些步骤的源代码好吗?我相信您现在要查找的文件是[OpenCV_proj_dir]/samples/cpp/squares.cpp。
    Center: (100, 100)
    
    Center: (200, 200)
    
    Center: (300, 300)
    
    import cv2
    import numpy as np
    
    # Load image, convert to grayscale, and Otsu's threshold 
    image = cv2.imread('1.png')
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
    
    # Find contours and extract the bounding rectangle coordintes
    # then find moments to obtain the centroid
    cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
    cnts = cnts[0] if len(cnts) == 2 else cnts[1]
    for c in cnts:
        # Obtain bounding box coordinates and draw rectangle
        x,y,w,h = cv2.boundingRect(c)
        cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 2)
    
        # Find center coordinate and draw center point
        M = cv2.moments(c)
        cx = int(M['m10']/M['m00'])
        cy = int(M['m01']/M['m00'])
        cv2.circle(image, (cx, cy), 2, (36,255,12), -1)
        print('Center: ({}, {})'.format(cx,cy))
    
    cv2.imshow('image', image)
    cv2.waitKey()