Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python3 OpenCV颜色对象检测与定义的边缘_Python_Opencv - Fatal编程技术网

Python3 OpenCV颜色对象检测与定义的边缘

Python3 OpenCV颜色对象检测与定义的边缘,python,opencv,Python,Opencv,我的python代码通过桌面截图,在黑色背景上寻找一个红色矩形,当我使用cv2.findcontours时,它没有返回一个精确大小的矩形,它似乎被扭曲了。我想获得形状的确切面积。另外,我截图上的图像没有像素化,边界很清晰。 谢谢你的帮助 frame_TS_new_raw = np.array(sct.grab(monitor_TS_new)) frame_TS_new = cv2.cvtColor(frame_TS_new_raw, cv2.COLOR_RGBA2RGB) green_mask

我的python代码通过桌面截图,在黑色背景上寻找一个红色矩形,当我使用cv2.findcontours时,它没有返回一个精确大小的矩形,它似乎被扭曲了。我想获得形状的确切面积。另外,我截图上的图像没有像素化,边界很清晰。 谢谢你的帮助

frame_TS_new_raw = np.array(sct.grab(monitor_TS_new))
frame_TS_new = cv2.cvtColor(frame_TS_new_raw, cv2.COLOR_RGBA2RGB)

green_mask_TS_new = cv2.inRange(frame_TS_new,green_lower_range, green_upper_range)

# find contours for New TS
cnts_green_new = cv2.findContours(green_mask_TS_new.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
cnts_green_new = cnts_green_new[0] if imutils.is_cv2() else cnts_green_new[1]
if len(cnts_green_new) > 0:
    for c in cnts_green_new:
        # if the contour is not sufficiently large, ignore it
        if cv2.contourArea(c) > 100:
            area = cv2.contourArea(c)
蒙版和未蒙版的屏幕截图


左侧的图像是原始屏幕截图,右侧的图像是遮罩图像。

要查找图像中的红色矩形区域,可以执行以下操作:

  • 提取图像的红色通道
  • 阈值红色通道
  • 计数非零像素数
示例代码:

import cv2
import numpy as np

img = cv2.imread('vju0v.png')
img = np.array(img) # convert to numpy array
red = img[:,:,2]    # extract red channel
rect = np.float32(red > 200)   # find red pixels
area = np.sum(rect)    # count nonzero pixels

print('Area = ' + str(area))

cv2.imshow('Red Channel',rect)
cv2.waitKey(0)

你说的“左边的图像”和“右边的图像”是什么意思?只有一个巨大的白色图像,左上角有两个小斑点……是的,谢谢你,我编辑了图像,使它变大了。谢谢,我有没有办法使用这种计算像素的方法,但使用一个范围,因为我需要检测三种不同的红色,但我不想重叠其他颜色(例如深红色和灰色)?您可以将范围定义为rect=np.float32(红色>200,红色<225)其他颜色的范围如何?例如,如果我希望红色从30到255,绿色0到100,蓝色0到85?您可以获得三个通道,分别为红色=img[:,:,2]和绿色=img[:,:,1]和蓝色=img[:,:,:,0],并使用您的范围获取颜色。我得到以下错误:rect=np.float32(红色>30,红色<255)#查找红色像素值错误:包含多个元素的数组的真值不明确。使用a.any()或a.all()