Python open-cv cv2.cvtColor 错误 (COLOR_BGR2GRAY)
Python open-cv cv2.cvtColor Error (COLOR_BGR2GRAY)
我的代码中 cv2.cvtColor 有问题:
sct_img = self.screen.grab(self.monitor)
img = Image.frombytes('RGB', sct_img.size, sct_img.rgb)
img = np.array(img)
img = self.convert_rgb_to_bgr(img)
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
lower = np.array([0, 0, 218])
upper = np.array([157, 54, 255])
mask = cv2.inRange(hsv, lower, upper)
...
错误:
cv2.error: OpenCV(4.2.0) c:\projects\opencv-python\opencv\modules\imgproc\src\color.simd_helpers.hpp:92: error: (-2:Unspecified error) in function '__cdecl cv::impl::`anonymous-namespace'::CvtHelper<struct cv::impl::`anonymous namespace'::Set<3,4,-1>,struct cv::impl::A0x3b52564f::Set<3,-1,-1>,struct cv::impl::A0x3b52564f::Set<0,5,-1>,2>::CvtHelper(const class cv::_InputArray &,const class cv::_OutputArray &,int)'
> Invalid number of channels in input image:
> 'VScn::contains(scn)'
> where
> 'scn' is 1
我在导入已经使用“img = cv2.imread(image_path)”灰度化的图像之前对其进行了测试,然后使用 hsv 进行了灰度化处理……它运行良好,但现在我用 运行 截取屏幕截图并尝试使用“cv2.COLOR_BGR2GRAY”进行灰度化,我在上面遇到了这个错误。当我删除该行时,我不会收到任何错误,但图像没有达到我想要的阈值。因此,在我的代码继续使用 hsv 之前,有必要对图像进行灰度化...
我希望有人能为我提供解决方案,在此先感谢!
cv2.COLOR_BGR2HSV
表示它期望 BGR 图像作为输入,并将 return HSV 图像。它实际上不知道您是否完全通过 BGR 或任何其他 3 通道格式,但在您的情况下,您正试图为其提供 1 通道灰度图像,这很关键。您应该将灰度转换回 BGR(opencv 只会将灰色通道增加三倍)然后执行 BGR2HSV
.
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
但是等等,你为什么需要?将灰度转换为 HSV 将使 H 和 S 通道充满零,而 V 将等于您已有的灰色通道。
我的代码中 cv2.cvtColor 有问题:
sct_img = self.screen.grab(self.monitor)
img = Image.frombytes('RGB', sct_img.size, sct_img.rgb)
img = np.array(img)
img = self.convert_rgb_to_bgr(img)
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
lower = np.array([0, 0, 218])
upper = np.array([157, 54, 255])
mask = cv2.inRange(hsv, lower, upper)
...
错误:
cv2.error: OpenCV(4.2.0) c:\projects\opencv-python\opencv\modules\imgproc\src\color.simd_helpers.hpp:92: error: (-2:Unspecified error) in function '__cdecl cv::impl::`anonymous-namespace'::CvtHelper<struct cv::impl::`anonymous namespace'::Set<3,4,-1>,struct cv::impl::A0x3b52564f::Set<3,-1,-1>,struct cv::impl::A0x3b52564f::Set<0,5,-1>,2>::CvtHelper(const class cv::_InputArray &,const class cv::_OutputArray &,int)'
> Invalid number of channels in input image:
> 'VScn::contains(scn)'
> where
> 'scn' is 1
我在导入已经使用“img = cv2.imread(image_path)”灰度化的图像之前对其进行了测试,然后使用 hsv 进行了灰度化处理……它运行良好,但现在我用 运行 截取屏幕截图并尝试使用“cv2.COLOR_BGR2GRAY”进行灰度化,我在上面遇到了这个错误。当我删除该行时,我不会收到任何错误,但图像没有达到我想要的阈值。因此,在我的代码继续使用 hsv 之前,有必要对图像进行灰度化...
我希望有人能为我提供解决方案,在此先感谢!
cv2.COLOR_BGR2HSV
表示它期望 BGR 图像作为输入,并将 return HSV 图像。它实际上不知道您是否完全通过 BGR 或任何其他 3 通道格式,但在您的情况下,您正试图为其提供 1 通道灰度图像,这很关键。您应该将灰度转换回 BGR(opencv 只会将灰色通道增加三倍)然后执行 BGR2HSV
.
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
但是等等,你为什么需要?将灰度转换为 HSV 将使 H 和 S 通道充满零,而 V 将等于您已有的灰色通道。