如果在纯白色背景上有一个对象,是否有人知道OpenCV是否提供了从捕获的帧中轻松检测对象的功能?
我正在尝试找到对象(矩形)的角点/中心点。我目前正在做的方式是蛮力(扫描物体的图像)而不准确。我想知道是否有我不知道的功能。
修改详情: 大小与苏打水相同。相机位于物体上方,为其提供2D /矩形感。来自相机的方向/角度是随机的,这是从角点计算的。
它只是一个白色背景,上面有物体(黑色)。拍摄的质量与您希望从Logitech网络摄像头看到的一样。
一旦我得到了角点,我就计算了中心。然后将中心点转换为厘米。
我正在努力关注那些4角的'如何'。您可以使用此图片查看我的强力方法:Image
答案 0 :(得分:26)
已经有一个如何在OpenCV中进行矩形检测的例子(在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}
不是他们正在做的事情的准确音译,但它应该对你有帮助。
答案 1 :(得分:7)
希望这有帮助,使用矩量法得到黑白图像的质心。
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;
}
答案 2 :(得分:4)
OpenCV拥有大量功能,可以帮助您实现这一目标。如果您使用该语言进行编程,请下载Emgu.CV以获取包装到库中的C#.NET。
获得所需内容的一些方法:
像以前一样找到角落 - 例如“CornerHarris”OpenCV功能
阈值图像并计算重心 - 请参阅http://www.roborealm.com/help/Center%20of%20Gravity.php ...这是我将使用的方法。您甚至可以在COG例程中执行阈值处理。即cog_x + = * imagePtr&lt; 128? 255:0;
找到图像的瞬间以提供旋转,重心等 - 例如“Moments”OpenCV功能。 (我没有用过这个)
(编辑)AForge.NET库具有角点检测功能以及连接到网络摄像头的示例项目(MotionDetector)和库。假设您使用的是Windows和.NET,我认为这将是最简单的方法。
答案 3 :(得分:1)
由于没有人发布完整的OpenCV解决方案,因此以下是一种简单的方法:
获得二进制图像。我们加载图像,转换为灰度,然后使用Otsu's threshold
查找外部轮廓。我们使用findContours
查找轮廓,然后使用boundingRect
查找中心坐标。由于具有轮廓,因此可以使用moments来提取轮廓的质心
这是一个以绿色突出显示边界框和中心点的示例
输入图片->
输出
Center: (100, 100)
Center: (200, 200)
Center: (300, 300)
所以回顾一下:
给出一个纯白色背景上的对象,有人知道OpenCV是否提供了从捕获的帧中轻松检测对象的功能吗?
首先获取二进制图像(Canny edge detection,simple thresholding,Otsu's threshold或Adaptive threshold),然后使用findContours
查找轮廓。要获取边界矩形坐标,可以使用boundingRect
,它会以x,y,w,h
的形式给出坐标。要绘制矩形,可以使用rectangle
绘制矩形。这将为您提供轮廓的4个角点。如果要获取中心点,请使用
moments
提取轮廓的质心
代码
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()
答案 4 :(得分:0)
它通常在其他机器视觉库中称为blob分析。我还没有用过opencv。