当前位置: 首页 > 知识库问答 >
问题:

网络摄像头图像的颜色检测效率不高

匡旭东
2023-03-14

我正在做一个项目,试图探测特定表面(竞技场)上的绿色和红色圆圈。当我尝试使用数字版本的竞技场(PNG图像)时,我可以成功地检测到两个彩色圆圈。

现在,我将这个竞技场打印在一个flex上(没有这两个彩色圆圈),并手动在上面放置彩色圆形硬币。但在通过1.3 MP的网络摄像头捕捉到它的图像后,颜色检测无法工作,并给出了错误的结果。

以下是通过网络摄像头拍摄的打印竞技场:

为什么没有检测到颜色?我需要对网络摄像头图像进行后处理吗?我试图通过2D锐化cv2.filter图像,但它也不起作用。

下面是从我的Python代码中检测红圈的片段:

ip_image=cv2.imread("image.png")
kernel = np.array([[-1,-1,-1],[-1,9,-1],[-1,-1,-1]])
ip_image=cv2.filter2D(ip_image,-1,kernel)
#cv2.imshow("Hi",ip_image)
hsv=cv2.cvtColor(ip_image,cv2.COLOR_BGR2HSV)
red_low=np.array([0,255,255])
red_up=np.array([10,255,255])
mask0= cv2.inRange(hsv,red_low,red_up)
red_low=np.array([170,255,255])
red_up=np.array([180,255,255])
mask1=cv2.inRange(hsv,red_low,red_up)
mask_red=mask1+mask0
r_img= ip_image.copy()
r_img[np.where(mask_red==0)] = 0
gray_img0 = cv2.cvtColor(r_img,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(gray_img0,0,255,0)
M = cv2.moments(thresh)
rX=int(M["m10"] / M["m00"])
rY=int(M["m01"] / M["m00"])
cv2.circle(ip_image,(rX,rY), 17, (255,255,255), 2)
cv2.imshow("Output",ip_image)

还有cv2中的第四个html" target="_blank">参数。threshold()设置为“0”时,可以正确处理数字图像,而对于网络摄像头图像,它会在以下行中抛出零除法错误:

rX=int(M["m10"]/M["m00"])

共有2个答案

徐阳炎
2023-03-14

由于光的变化,硬阈值不会帮助你找到期望的圆,你应该考虑目标颜色的间隔。例如,找到绿色值在200到255之间的所有像素(通过尝试和错误设置),以确保始终捕捉到小圆圈。

现在,图像的其他部分也可能在阈值化后存活下来。在这种情况下,您可以通过形状分析方法(如Hough Circle detector)或基于其尺寸来过滤这些不需要的零件。

茹正祥
2023-03-14

改善初始条件(透视、光线、分辨率等)绝对值得尝试。网络摄像头产生的当前结果有些糟糕,所以与其花大量时间修复,不如使用更便宜的硬件。

你可以用一些花哨的方法来改善你的形象,但尽管如此,最好有更多有价值的投入。

正如你所看到的,有些区域的颜色非常相似。我使用了更高级的颜色相似性函数来处理复杂的情况。基本上,我用一些阈值指定了红色和绿色。Delta E将是正确的起点。让我们看看实际的形状:

有了这些结果,你可以做一个简单的形状分析,或者只是比较区域来找到你的标记。我更喜欢有更独特的颜色和更好的初始条件。

无论如何,任何现实生活场景都需要你在使用颜色时非常小心:

(见行动中)

类似的问题:

在光照不强的环境下,通过衣服颜色识别人的问题

 类似资料:
  • 问题内容: 如何连续从摄像头捕获图像? 我想尝试对象识别(也许使用Java Media Framework)。 我当时正在考虑创建两个线程 一个线程: 节点1:捕获实时图像 节点2:将图片另存为“ 1.jpg” 节点3:等待5秒 节点4:重复… 其他线程: 节点1:等到捕获图像 节点2:使用“ 1.jpg”获取每个像素的颜色 节点3:将数据保存在数组中 节点4:重复… 问题答案: 此JavaCV实

  • 我正在开发一个web应用程序,它可以浏览和拍摄本地照片,我还想通过相机拍摄图像。我使用下面的代码,我可以捕捉设备摄像头。 现在,我想获得图像和onchangeevent,转换为base64,并希望在该页面中显示。 好心帮我伙计们!

  • 以下程序演示如何使用系统相机检测脸部并使用JavaFX窗口显示脸部。 参考以下示例代码 - 执行上面示例代码,得到以下结果 - 系统提示:头像太丑,无法显示…

  • 我有一个应用程序,它使用Camera2 API来预览相机。我想在手机的镜头之间进行选择。在我的代码中,我使用了以下代码: 当我使用我的galaxy s10时,它有2个前置摄像头(普通和宽)和3个后置摄像头,我只从经理那里得到4个ID: 为什么我没有3后置微距相机。 这些问题出现在我所有的手机上,手机背面有一个以上的摄像头 我怎样才能得到所有的后摄像头? TNX领先

  • 我试图从我的摄像头获取图像使用导入OpenCV的python代码。代码如下: 代码工作正常,除了相机默认分辨率为640x480,我的代码似乎只能设置比这更低的分辨率值。例如,我可以将图像大小设置为320x240,但我不能将其更改为800x600。我没有出现错误:只是分辨率设置为默认值(640x480),因为我试图将其设置为更高的值。 我正在使用的摄像头(没有其他网络摄像头连接到计算机)是Quick

  • Dlib有一个非常方便、快速和高效的目标检测程序,我想做一个类似于这个例子的酷脸跟踪例子。 OpenCV,这是广泛支持,有视频捕捉模块,这是相当快的(五分之一秒的快照相比,1秒或更多的调用一些程序,唤醒网络摄像头和获取图片)。我将此添加到Dlib中的人脸检测器Python示例中。 如果您直接显示和处理OpenCV VideoCapture输出,它看起来很奇怪,因为OpenCV显然存储BGR而不是R