当前位置: 首页 > 知识库问答 >
问题:

OpenCV FFMPEG RTSP摄像机馈电错误

后学
2023-03-14

#frame_406-[hevc@0b6bdb80]找不到POC为41的引用

我尝试用python和C++实现代码,结果相同。还尝试另存为。png而不是。jpg。rtsp feed在使用imshow显示相机时工作正常,只有在试图保存帧时才会出现问题。据我所知,这些错误都与ffmpeg有关,但是google对这些类型的错误帮助不大。

#include <iostream>
#include <opencv2\opencv.hpp>
#include <chrono>
#include <thread>

using namespace std;
using namespace cv;

int main() {

    VideoCapture cap("rtsp://admin:admin@192.168.88.97/media/video1");
    if (!cap.isOpened())
        return -1;

    for (int i = 0; i < 500; i++)
    {
        Mat frame;
        cap >> frame;
        imwrite("C:\\Users\\Documents\\Dev\\c++++\\OpenCVExample\\frames\\frame" + std::to_string(i) + ".png", frame);
        cout << i << "\n";
        std::this_thread::sleep_for(std::chrono::milliseconds(10));

    }

    return 0;
}

共有1个答案

养昊天
2023-03-14

OpenCV和RTSP流有点棘手。当无法足够快地读取流的帧时,通常会发生这种情况。在这种情况下(在某个地方),接收RTSP帧的缓冲区将被填充得比清空得快;当缓冲区已满时,它将被刷新,并将从最近的帧重新开始填充。这将破坏流解码直到下一个关键帧。

我的建议是删除sleep,即使10ms很小。由于这是不够的(:p),唯一的解决方案是实现一个线程不断地从CV::videocapture中读取帧,并在主线程忙于保存前一个帧时丢弃抓取的帧。

一个简单的实现可以是:

#include <opencv2/opencv.hpp>
#include <thread>

class VideoSourceHandler
{
public:
  // Video file or IP camera
  VideoSourceHandler( const std::string & source ) :
    mCapture( source ),
    mRun( false )
  {
  }

  // USB camera
  VideoSourceHandler( int webcamID ) :
    mCapture( webcamID ),
    mRun( false )
  {
  }

  // start and stopCapture can be squashed into C'tor and D'tor if you want RTTI
  void startCapture()
  {
    mRun = true;
    mLoopThread = std::thread( &VideoSourceHandler::threadLoop, this );
  }

  void stopCapture()
  {
    mRun = false;
    mLoopThread.join();
  }

  cv::Mat getFrame()
  {
    std::this_thread::yield(); // Be nice
    const std::lock_guard<std::mutex> lock( mMutex );
    return mCurrentFrame;
  }

private:
  void threadLoop()
  {
    while( mRun )
    {
      // Sleep if you want to "control" FPS
      {
        const std::lock_guard<std::mutex> lock( mMutex );
        mCapture >> mCurrentFrame;
      }
      std::this_thread::yield(); // Be nice
    }
  }

  cv::VideoCapture mCapture;
  std::thread      mLoopThread;
  std::mutex       mMutex;
  bool             mRun;
  cv::Mat          mCurrentFrame;
};

int main()
{
  VideoSourceHandler vsh( 0 );
  vsh.startCapture();
  while( true )
  {
    cv::Mat frame = vsh.getFrame();
    if( frame.empty() )
      continue;

    cv::imshow( "Test", frame );
    char key = cv::waitKey( 1 );
    if( key == 'q' || key == 27 )
      break;

  }
  vsh.stopCapture();
  return 0;
}
 类似资料:
  • 前面的教程中我们讨论了观察矩阵以及如何使用观察矩阵移动场景(我们向后移动了一点)。OpenGL本身没有摄像机(Camera)的概念,但我们可以通过把场景中的所有物体往相反方向移动的方式来模拟出摄像机,产生一种我们在移动的感觉,而不是场景在移动。 本节我们将会讨论如何在OpenGL中配置一个摄像机,并且将会讨论FPS风格的摄像机,让你能够在3D场景中自由移动。我们也会讨论键盘和鼠标输入,最终完成一个

  • 摄像机是玩家观察游戏世界的窗口,场景中至少需要有一个摄像机,也可以同时存在多个摄像机。创建场景时,Creator 会默认创建一个名为 Main Camera 的摄像机,作为这个场景的主摄像机。多摄像机的支持可以让你轻松实现高级的自定义效果,比如双人分屏效果,或者场景小地图的生成。 摄像机属性 backgroundColor 当指定了摄像机需要清除颜色的时候,摄像机会使用设定的背景色来清除场景。 d

  • 摄像机的抽象基类。在构建新摄像机时,应始终继承此类。 构造函数 Camera() 创建一个新的Camera(摄像机)。注意:这个类并不是被直接调用的;你所想要的或许是一个 PerspectiveCamera(透视摄像机)或者 OrthographicCamera(正交摄像机)。 属性 共有属性请参见其基类Object3D .layers : Layers 摄像机是一个layers的成员. 这是一个

  • 摄像机,如同大家拍照时使用的相机,用来确定观察 3D 场景的视角。 摄像机包含两个重要的位置参数:镜头位置 position 和被拍摄物体的位置 target (又叫目标点)。 控制摄像机位置 设置摄像机位置 将下面的代码输入到项目文件中,即可获取当前摄像机 camera 的 position 和 target 属性,就可以得到 3D 场景中摄像机的位置信息,也可以将其打印在控制台中。 // 加载

  • Cameras are the devices that capture and display the world to the player. By customizing and manipulating cameras, you can make the presentation of your game truly unique. You can have an unlimited nu

  • Just as cameras are used in films to display the story to the audience, Cameras in Unity are used to display the game world to the player. You will always have at least one camera in a scene, but you