opencv用gstreamer命令方式打开网络摄像头黑屏,opencv版本为4.7.0


#include <gst/gst.h>
#include <opencv2/opencv.hpp>
#include <iostream>
#include <string>
using namespace std;
using namespace cv;
int main(int argc, char *argv[]) {
    std::string rtsp_url = "rtsp://admin:fgfg5678@192.168.10.66:554/h264/ch1/main/av_stream";
    size_t latency = 200;
    size_t framerate  = 15;
    // rtsp视频流
    string gst_in = "rtspsrc location=rtsp://admin:fgfg5678@192.168.10.66:554/h264/ch1/main/av_stream latency=0 ! h264parse ! decodebin ! videoconvert ! video/x-raw,format=(string)BGR ! appsink  drop=true";
    // string gst_in = "filesrc location=./test.mp4 ! decodebin ! videoconvert ! appsink drop=true caps=video/x-raw";
    VideoCapture cap = VideoCapture(gst_in, cv::CAP_GSTREAMER);
    // cv::VideoCapture cap("filesrc location=./test.mp4 ! decodebin ! videoconvert ! appsink drop=true caps=video/x-raw",cv::CAP_GSTREAMER);
    if(!cap.isOpened())
    {
        std::cout << "error to open camera." << std::endl;
        return -1;
    }
    cv::Mat frame ;
    std::cout << cap.get(3) << std::endl;
    std::cout << cap.get(4) << std::endl;
    while (cap.read(frame)) {
        cv::imshow("Received Frame", frame);
        cv::waitKey(1); // Force window to refresh
        if (cv::waitKey(1) == 27) // Exit when Esc key is pressed
            break;
}

有友友知道是什么问题吗?

检查摄像头的URL和连接:你能通过其他软件如VLC播放器成功访问你的RTSP流吗?如果不能,可能你的网络摄像头的URL是错误的,或者网络摄像头本身有问题。

检查GStreamer的安装和配置:你安装了GStreamer,并且OpenCV是用GStreamer选项编译的吗?你可以在你的代码中加入 cout << getBuildInformation() << endl; 来检查OpenCV的编译信息。

检查GStreamer管道:你的GStreamer管道可能是有问题的。可以尝试把你的管道直接粘贴到gst-launch-1.0命令来测试是否管道可以正常工作。

检查视频格式:你的RTSP流的视频格式是BGR吗?如果不是,那么videoconvert ! video/x-raw,format=(string)BGR可能无法正常工作。

检查应用程序的错误处理:你的应用程序在遇到错误时是否有适当的错误处理?例如,当cap.read(frame)返回false时,应用程序应该打印错误信息并退出,而不是继续尝试读取帧。

检查延迟设置:在你的GStreamer管道中,你已经把延迟设置为0了。这可能导致GStreamer无法处理实时流。你可以尝试增加延迟设置,例如将其设为100或200。

opencv的版本和gst(gstreamer)的版本不兼容吧

opencv中打开摄像头显示黑屏

<span style="font-size:18px;">#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
using namespace std;
using namespace cv;
void main()
{
 Mat input_image;
    VideoCapture cam(0);
    if(!cam.isOpened()) exit(0);
 namedWindow("input image");
    while(true) {
        cam >> input_image;
        imshow("input image", input_image);
        if(27 == waitKey(30))
            break;
    }
}</span>

摄像头确定正常吗?还是url指定的有问题?必要的话远程看一下。

首先你要看下你使用的库函数是否正确的,不同的opencv版本,可能使用的函数是不一样的哦。其次,你是使用cvCreateCameraCapture打开的摄像头吗,如果是的话,你换成VedioCapture看看行不行,代码如下:

#include <stdio.h>

#include <opencv2\highgui.hpp>

#include <opencv2\imgproc\imgproc.hpp>


using namespace cv;


void tttt();

int main() {

VideoCapture cap(0);

if (!cap.isOpened())

{

return -1;

}

Mat frame;

Mat edges;


bool stop = false;

while (!stop)

{

cap >> frame;

cvtColor(frame, edges, CV_BGR2GRAY);

GaussianBlur(edges, edges, Size(7, 7), 1.5, 1.5);

//Canny(edges, edges, 0, 30, 3);

imshow("当前视频", edges);

if (waitKey(33) =='q')

stop = true;

}

return 0;

}

检查一下opencv版本是否匹配

TechWhizKid参考GPT回答:

你遇到的问题可能由多个因素导致,例如网络摄像头的连接问题、GStreamer的安装或配置问题,或是OpenCV的编译问题。下面是一些你可以尝试的解决步骤:

  1. 检查摄像头的URL和连接:你能通过其他软件如VLC播放器成功访问你的RTSP流吗?如果不能,可能你的网络摄像头的URL是错误的,或者网络摄像头本身有问题。

  2. 检查GStreamer的安装和配置:你安装了GStreamer,并且OpenCV是用GStreamer选项编译的吗?你可以在你的代码中加入 cout << getBuildInformation() << endl; 来检查OpenCV的编译信息。

  3. 检查GStreamer管道:你的GStreamer管道可能是有问题的。可以尝试把你的管道直接粘贴到gst-launch-1.0命令来测试是否管道可以正常工作。

  4. 检查视频格式:你的RTSP流的视频格式是BGR吗?如果不是,那么videoconvert ! video/x-raw,format=(string)BGR可能无法正常工作。

  5. 检查应用程序的错误处理:你的应用程序在遇到错误时是否有适当的错误处理?例如,当cap.read(frame)返回false时,应用程序应该打印错误信息并退出,而不是继续尝试读取帧。

  6. 检查延迟设置:在你的GStreamer管道中,你已经把延迟设置为0了。这可能导致GStreamer无法处理实时流。你可以尝试增加延迟设置,例如将其设为100或200。

  • 最后,你应该更新你的OpenCV和GStreamer库到最新版本,因为旧版本可能包含已知的bug。

回答部分参考、引用ChatGpt以便为您提供更准确的答案:

根据您提供的代码和描述,打开网络摄像头时遇到黑屏的问题可能是由于以下原因之一:

  1. 检查网络摄像头的连接和配置: 确保网络摄像头与计算机处于相同的局域网,并且网络摄像头的地址、用户名、密码等配置信息正确。可以尝试使用其他工具或软件来确认网络摄像头是否正常工作。
  2. 检查GStreamer插件的安装和配置: 确保已正确安装GStreamer插件,并且与OpenCV版本兼容。您可以尝试在终端中使用GStreamer命令行工具,例如gst-launch-1.0,来查看是否可以正常打开网络摄像头。
  3. 检查网络带宽和延迟设置: 如果网络带宽不足或延迟较高,可能导致视频流无法正常传输。您可以尝试调整代码中的latency参数,增加缓冲时间,以便更好地适应网络条件。
  4. 检查摄像头支持的视频格式: 网络摄像头可能支持多种视频格式,您可以尝试调整代码中的gst_in字符串,指定与摄像头兼容的视频格式。可以尝试使用video/x-raw,format=(string)YUY2或其他常见的视频格式。
  5. 检查OpenCV版本和依赖项: 确保您的OpenCV版本与GStreamer插件和其他依赖项兼容。某些版本的OpenCV可能需要特定的GStreamer插件版本或其他库文件。

综上所述,您可以按照以上步骤逐一排查可能的问题,从而解决打开网络摄像头黑屏的情况。

根据你提供的代码,使用GStreamer命令方式打开网络摄像头出现黑屏的问题可能是由于以下原因:

  1. GStreamer插件缺失:确保已正确安装和配置了GStreamer,并且所需的插件已正确安装。可以尝试使用gst-launch-1.0命令行工具直接运行相同的GStreamer命令,看是否能够正常获取视频流。

  2. 缓冲区延迟设置:在你的代码中,你设置了latency=0,这可能导致视频流的延迟较低导致黑屏。你可以尝试增加延迟值,例如将latency=200修改为latency=500,看是否有改善。

  3. 硬件或网络问题:确保网络摄像头的连接正常,可以通过其他工具或软件测试网络摄像头是否能够正常获取视频流。另外,也可以尝试使用本地文件(如测试视频文件)替代网络摄像头进行测试,看是否能够正常显示。

  4. OpenCV版本兼容性:确保你使用的OpenCV版本与GStreamer和相关库的版本兼容。不同版本的OpenCV可能对GStreamer的支持存在一些差异。

如果以上方法仍无法解决问题,可以尝试使用其他方法来打开网络摄像头,如使用RTSP协议的URL,或者使用其他库如FFmpeg来处理视频流。此外,你也可以查看OpenCV的文档和社区论坛,寻找类似问题的解决方案或其他用户的经验分享。