【问题标题】:How to find the colored circles in an image opencv python for game development如何在图像opencv python中找到彩色圆圈以进行游戏开发
【发布时间】:2019-01-09 18:40:48
【问题描述】:

我有一个布局图像,我很想找出有些颜色的圆圈 这段代码无法识别圆圈

这是我需要识别不同颜色的圆圈的图像

代码:-

import cv2
import numpy as np

img = cv2.imread('test7.png',0)
img = cv2.equalizeHist(img)
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)

circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,10,param1=50,param2=30,minRadius=0,maxRadius=25)

circles = np.uint16(np.around(circles))
for i in circles[0,:]:
    # draw the outer circle
    cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)

cv2.imshow('detected circles',cimg)
cv2.waitKey(0)
cv2.destroyAllWindows()

但这给了我错误 错误

    circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,10,param1=50,param2=30,minRadius=0,maxRadius=25)
cv2.error: OpenCV(3.4.2) /Users/travis/build/skvark/opencv-python/opencv/modules/imgproc/src/hough.cpp:1737: error: (-215:Assertion failed) !_image.empty() && _image.type() == (((0) & ((1 << 3) - 1)) + (((1)-1) << 3)) && (_image.isMat() || _image.isUMat()) in function 'HoughCircles'

我有 3 张图片,狗、猴子、驴。

我需要将这些狗、猴子、驴的图像放在这些圆圈上并调整它们的大小。

这些图片的照片

我想要这样的最终输出。

【问题讨论】:

标签: python opencv


【解决方案1】:

您可以尝试通过将图像转换为 HSV 颜色空间来过滤掉您的圈子 - cv2.COLOR_BGR2HSV。然后您可以使用 cv2.inRange() 搜索您的颜色并将它们绘制在蒙版上(每种颜色都使用不同的蒙版)

类似这样的:

过滤掉圆圈后,您可以使用cv2.findContours() 搜索轮廓并找到它的位置(您可以搜索它的中心点或极值点),以确定您应该在图像上放置较小图像的位置。请注意,我已经手动调整了您的较小图像,如果您想拥有同一张图片的不同尺寸,您将不得不修改代码。此外,如果您想保持透明度,您应该使用图像的通道并更改代码。这只是我将如何处理任务的一个示例。

示例代码(不透明,图片大小相同):

import cv2
import numpy as np

img = cv2.imread('thermal2.png')
dog = cv2.imread('resize1.jpg')
donkey = cv2.imread('resize2.jpg')
monkey = cv2.imread('resize3.png')

resize1 = cv2.resize(dog, (35, 40))
resize2 = cv2.resize(donkey, (60, 35))
resize3 = cv2.resize(monkey, (40, 40))

hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

lower_blue = np.array([110,50,50])
upper_blue = np.array([130,255,255])
lower_red = np.array([0,50,50])
upper_red = np.array([10,255,255])
lower_yellow = np.array([30,50,50])
upper_yellow = np.array([50,255,255])

mask_blue = cv2.inRange(hsv, lower_blue, upper_blue)
mask_red = cv2.inRange(hsv, lower_red, upper_red)
mask_yellow = cv2.inRange(hsv, lower_yellow, upper_yellow)

res_blue = cv2.bitwise_and(img,img, mask=mask_blue)
res_red = cv2.bitwise_and(img,img, mask=mask_red)
res_yellow = cv2.bitwise_and(img,img, mask=mask_yellow)

gray_blue = cv2.cvtColor(res_blue, cv2.COLOR_BGR2GRAY)
gray_red = cv2.cvtColor(res_red, cv2.COLOR_BGR2GRAY)
gray_yellow = cv2.cvtColor(res_yellow, cv2.COLOR_BGR2GRAY)

_,thresh_blue = cv2.threshold(gray_blue,10,255,cv2.THRESH_BINARY)
_,thresh_red = cv2.threshold(gray_red,10,255,cv2.THRESH_BINARY)
_,thresh_yellow = cv2.threshold(gray_yellow,10,255,cv2.THRESH_BINARY)

_, contours_blue, hierarhy1 = cv2.findContours(thresh_blue,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
_, contours_red, hierarhy2 = cv2.findContours(thresh_red,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
_, contours_yellow, hierarhy3 = cv2.findContours(thresh_yellow,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

for c in contours_red:
    size = cv2.contourArea(c)
    if size > 30:
        cXY_left = tuple(c[c[:, :, 0].argmin()][0])
        cXY_top = tuple(c[c[:, :, 1].argmin()][0])
        cX = cXY_left[0]
        cY = cXY_top[1]
        img[cY:cY+resize1.shape[0], cX:cX+resize1.shape[1]]=resize1

for c in contours_blue:
    size = cv2.contourArea(c)
    if size > 30:
        cXY_left = tuple(c[c[:, :, 0].argmin()][0])
        cXY_top = tuple(c[c[:, :, 1].argmin()][0])
        cX = cXY_left[0]
        cY = cXY_top[1]
        img[cY:cY+resize2.shape[0], cX:cX+resize2.shape[1]]=resize2

for c in contours_yellow:
    size = cv2.contourArea(c)
    if size > 30:
        cXY_left = tuple(c[c[:, :, 0].argmin()][0])
        cXY_top = tuple(c[c[:, :, 1].argmin()][0])
        cX = cXY_left[0]
        cY = cXY_top[1]
        img[cY:cY+resize3.shape[0], cX:cX+resize3.shape[1]]=resize3

cv2.imshow('blue', res_blue)
cv2.imshow('red', res_red)
cv2.imshow('yellow', res_yellow)
cv2.imshow('img',img)

结果:

【讨论】:

  • 您好,谢谢!最后的输出是否可以使背景完全白色,只有猴子、驴、狗的图像?
  • 这是可能的,但正如我在答案中提到的,你必须玩弄你的图片频道。据我所知,.png 有 4 个频道,.jpg 有 3 个频道,所以您可能需要添加另一个频道或类似的东西 - 我在这方面没有太多经验。要使圆圈变白,请在 for 循环中添加 'cv2.drawContours(img, [c], -1, (255,255,255), -1)'。
  • 对不起,您是指只有动物图片的空白(白色)蒙版,还是原始图像上只有具有透明背景的动物图片?你要明白,你上传的图片是.jpg格式的,从.png转为.jpg时会丢失透明度。
猜你喜欢
  • 2023-04-03
  • 2011-12-25
  • 1970-01-01
  • 2015-11-07
  • 1970-01-01
  • 2016-12-14
  • 2018-10-14
  • 2022-12-06
  • 1970-01-01
相关资源
最近更新 更多