Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.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
Python 在BGR比例(OpenCV)中看不到帧_Python_Opencv_Slam - Fatal编程技术网

Python 在BGR比例(OpenCV)中看不到帧

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

我正在尝试从头开始使用OpenCV为SLAM编写代码。当我试图用彩色圆形标记显示从每个帧检测到的特征时,我在用彩色显示时遇到了一个问题

总结

  • 对于
    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:)