Python 在BGR比例(OpenCV)中看不到帧
我正在尝试从头开始使用OpenCV为SLAM编写代码。当我试图用彩色圆形标记显示从每个帧检测到的特征时,我在用彩色显示时遇到了一个问题 总结Python 在BGR比例(OpenCV)中看不到帧,python,opencv,slam,Python,Opencv,Slam,我正在尝试从头开始使用OpenCV为SLAM编写代码。当我试图用彩色圆形标记显示从每个帧检测到的特征时,我在用彩色显示时遇到了一个问题 总结 对于goodFeaturesToTrack功能,cv2.cvtColor(img,cv2.BGR2GRAY)过程应首先完成 然后在goodFeaturesToTrack过程之后,我尝试在帧中的彩色圆圈中指示特征 所以,我将帧转换为cv2.GRAY2BGR 我希望在框架中有彩色圆形标记,但目前还没有看到 #! /usr/bin/env python3 i
- 对于
功能,goodFeaturesToTrack
过程应首先完成cv2.cvtColor(img,cv2.BGR2GRAY)
- 然后在
过程之后,我尝试在帧中的彩色圆圈中指示特征goodFeaturesToTrack
- 所以,我将帧转换为
cv2.GRAY2BGR
#! /usr/bin/env python3
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
W = 1920//2
H = 1080//2
def process(image):
image = cv.resize(image,(W,H))
image = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
corners = cv.goodFeaturesToTrack(image, 3000, 0.01, 3)
corners = np.int0(corners)
image_copy = cv.cvtColor(image, cv.COLOR_GRAY2BGR)
for i in corners:
x, y = i.ravel()
cv.circle(image_copy, (x,y), color = (0,0,255), radius=3)
#cv.circle(image, (x,y), 3, 255, -1)
return image_copy
if __name__ == "__main__":
cap = cv.VideoCapture("../test/test_countryroad.mp4")
while cap.isOpened():
ret, frame = cap.read()
if ret == True:
frame = process(frame)
frame = cv.cvtColor(frame, cv.COLOR_GRAY2RGB)
cv.imshow('frame', frame)
if cv.waitKey(1) & 0xFF == ord('q'):
break
else:
break
cap.release()
cv.destroyAllWindows()
但是在我运行这段代码之后,错误如下所示
Traceback (most recent call last):
File "./slam.py", line 34, in <module>
frame = cv.cvtColor(frame, cv.COLOR_GRAY2RGB)
cv2.error: OpenCV(4.2.0) /home/hkim/opencv/opencv-4.2.0/modules/imgproc/src/color.simd_helpers.hpp:92: error: (-2:Unspecified error) in function 'cv::impl::{anonymous}::CvtHelper<VScn, VDcn, VDepth, sizePolicy>::CvtHelper(cv::InputArray, cv::OutputArray, int) [with VScn = cv::impl::{anonymous}::Set<1>; VDcn = cv::impl::{anonymous}::Set<3, 4>; VDepth = cv::impl::{anonymous}::Set<0, 2, 5>; cv::impl::{anonymous}::SizePolicy sizePolicy = (cv::impl::<unnamed>::SizePolicy)2; cv::InputArray = const cv::_InputArray&; cv::OutputArray = const cv::_OutputArray&]'
> Invalid number of channels in input image:
> 'VScn::contains(scn)'
> where
> 'scn' is 3
回溯(最近一次呼叫最后一次):
文件“/slam.py”,第34行,在
框架=cv.CVT颜色(框架,cv.COLOR\u GRAY2RGB)
cv2.error:OpenCV(4.2.0)/home/hkim/OpenCV/OpenCV-4.2.0/modules/imgproc/src/color.simd_helpers.hpp:92:error:(-2:Unspecified error)在函数'cv::impl::{anonymous}::CvtHelper::CvtHelper(cv::InputArray,cv::OutputArray,int)[带VScn=cv::impl:{anonymous}匿名}集;VDcn=impl:{anonymousous}集;VDepth=impl:{::Set;cv::impl::{匿名}::SizePolicy SizePolicy=(cv::impl:::SizePolicy)2;cv::InputArray=const cv::_InputArray&;cv::OutputArray=const cv:_OutputArray&]
>输入图像中的通道数无效:
>'VScn::contains(scn)'
>在哪里
>“scn”是3
如何修复它?您的图像是灰度图像,因此当您试图在图像中绘制彩色圆圈时,您无法修复,因为只有一个通道,而彩色图像的预期通道是三个。你需要做的是创建一个单独的帧副本,这样你就可以在上面运行兴趣点检测,获得角点,然后在图像的彩色版本上绘制它们
def过程(图像):
图像=cv.调整大小(图像,(W,H))
#改变
图像\复制=cv.CVT颜色(图像,cv.COLOR\ BGR2GRAY)
#改变
角点=cv.goodFeaturesToTrack(图像拷贝,3000,0.01,3)
角点=np.int0(角点)
对于我来说,在角落里:
x、 y=i.ravel()
等速圆(图像,(x,y),颜色=(0,0255),半径=3)
返回图像
最后,在while
循环中,由于图像现在是彩色的,您可以删除从灰度到彩色的转换语句,因为函数返回已经是彩色的图像
当cap.isOpened()时:
ret,frame=cap.read()
如果ret==True:
框架=过程(框架)
#删除下面的行
#框架=cv.CVT颜色(框架,cv.COLOR\u GRAY2RGB)
cv.imshow('框架',框架)
如果cv.waitKey(1)&0xFF==ord('q'):
打破
其他:
打破
谢谢您的回复。但是我以前试过这个。。错误出现在下面的语句中。“输入图像中的通道数无效:>'VScn::contains(scn)”>,其中>'scn'为3”@HenryKIM,这是因为您需要删除while循环中的该语句。转换图像后,图像已经是彩色的。我将编辑我的答案。对不起,我编辑了我的问题,谢谢。错误终于解决了。但我想知道为什么框架仍然是灰色的,带有彩色标记。我想在RGB缩放框中看到彩色标记。是的,我做到了,感谢您指导新stackoverflower:)