我正在用c语言(32位)构建一个简单的应用程序,它使用opencv从rtsp摄像头抓取帧。
获取相机帧的函数在与主程序分开的线程中运行。
我用mp4视频测试了这个应用程序,效果很好。我能够抓取帧并处理它们。然而,当我使用rtsp链接时,尽管我能够打开与摄像头的连接,但每当我尝试读取grab()和read()函数时,返回False。
首先,我认为这是rtsp链接的一个问题,但我制作了一个简单的Python应用程序来测试它,它也可以工作。所以这不是联系。
这是我用来抓取画面的代码:
#ifndef _IMAGE_BUFFER_H_
#define _IMAGE_BUFFER_H_
#include <opencv2/core.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/highgui.hpp>
.
.
.
VideoCapture capture_;
string address_;
atomic<bool> keep_alive_;
thread thread_;
int fps_;
mutex mutex_;
list<FramePair> frames_;
int Run()
{
capture_.open(address_, cv::CAP_ANY);
if (!capture_.isOpened()) {
printf("Could not open Camera feed! \n");
return -1;
}
uint64_t period = uint64_t((float(1) / float(fps_)) * float(1000));
period = period - (period / 20);
uint64_t t0 = getCurrentTimeInMilli();
while (keep_alive_) {
uint64_t difftime = getCurrentTimeInMilli() - t0;
if (difftime < period) {
uint64_t sleep_time = period - difftime;
if (sleep_time < period) {
std::this_thread::sleep_for(std::chrono::milliseconds(sleep_time));
}
}
t0 = getCurrentTimeInMilli();
CaptureFrame();
}
return 0;
}
void CaptureFrame()
{
Mat frame;
bool ret = capture_.read(frame);
if (!ret) {
printf("Error in frame reading! \n");
}
vector<uint8_t> jpeg;
cv::imencode(".jpg", frame, jpeg, vector<int>());
mutex_.lock();
frames_.push_back(FramePair(getCurrentTimeInMilli(), jpeg));
if (frames_.size() > FRAME_QUEUE_SIZE)
frames_.pop_front();
mutex_.unlock();
}
我使用的OpenCv版本是3.4.5。
链接:rtsp://
我感谢你在这件事上的帮助。
我试过这个,但没用
- 还尝试了预构建的64位opencv 3.4.0版本,但仍然相同
很抱歉回答我自己的问题。
但经过大量的试验和错误,并阅读各种SO线程关于在Windows中使用cv::VideoCapture的问题。
我发现了问题,
我试图在应用程序中静态链接OpenCv,由于许可证问题,ffmpeg无法与应用程序一起静态编译。
我解决了它通过,复制opencv_ffmpegxxx.dll,可以在 /bin/中找到。并按照这里的建议将其粘贴在我的. exe文件夹中。
可能有一些变通方法可以将ffmpeg dll嵌入到应用程序中,如本文所建议的,但我还没有尝试。我希望其他人能从这个问题中受益。
谢谢你的帮助。
我从IP摄像头获取rtsp流,然后在opencv中传递该流以获取帧,但我在其中得到了扭曲的帧。但当我用视频文件代替rtsp流帧时,它并没有失真。 当流直接在vlc播放器和ffmpeg帧不失真。
我在为三星S21设计的应用程序中使用了Camera2 Api。这款手机有3个后置摄像头和一个前置摄像头。我试图选择使用的物理摄像机,但是函数getPhysicalCameraIds()总是返回一个空数组。是否有其他方法获取PhysicalCameraIds或指定要使用的摄像机??有人能解释一下吗?
我正在尝试使用GStreamer将RTMP/RTSP流连接到v4l2loopback虚拟设备。 工程1-RTMP至AutoVideoSink,sudo gst-launch-1.0 rtspsrc位置=rtsp://192.168.xxx.xxx/live/av0 ! decodebin!自动视频接收器sudo gst-launch-1.0 rtmpsrc位置=rtmp://192.168.xxx
我在从远程IP摄像头中抓取帧时遇到了问题。我的雇主希望在C#.NET(用于Windows)中完成,如果可能的话,使用轻量级的解决方案,即不使用任何庞大的框架。 该设备型号为DS-2CD2632F-I,它目前连接到我的局域网,相机的网络界面工作非常好。 我已经试用了几个流行的框架,例如AForge、EmguCV、OzekiSDK和directshow.net,但它们似乎都不起作用。特别是OzekiS
我正在尝试获取我网络上的摄像头产生的流。主要问题是这台相机产生的流是H264流。我四处寻找管理这种流的最佳方法,我发现mediacodec是最合适的类。不幸的是,这个API的文档很差,但尽管如此,我还是找到了一些资源,从中获得了这个类的基本信息,并编写了以下代码。 公共类DecodeActivity扩展Activity实现SurfaceHolder.Callback{ (20736):无法实例化类
我按照这个旋转捕获的图像。但我有一个错误。 我的代码 LogCat错误 这是236号线 我怎样才能解决这个问题?我从中找到了很多解决方案,但我仍然不知道如何解决它。有人能帮我解决这个问题吗?任何帮助都会很好,谢谢!!