#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。
我下载的是4.5.0版本的,开发板直接git的话,下载很慢。我选择用电脑下好再传给开发板,opencv-github,opencv4.5.0链接:https://pan.baidu.com/s/15WpUWDnfabdPfhLvkONoew提取码:veqb
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版本是否匹配
你遇到的问题可能由多个因素导致,例如网络摄像头的连接问题、GStreamer的安装或配置问题,或是OpenCV的编译问题。下面是一些你可以尝试的解决步骤:
检查摄像头的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。
回答部分参考、引用ChatGpt以便为您提供更准确的答案:
根据您提供的代码和描述,打开网络摄像头时遇到黑屏的问题可能是由于以下原因之一:
gst-launch-1.0
,来查看是否可以正常打开网络摄像头。latency
参数,增加缓冲时间,以便更好地适应网络条件。gst_in
字符串,指定与摄像头兼容的视频格式。可以尝试使用video/x-raw,format=(string)YUY2
或其他常见的视频格式。综上所述,您可以按照以上步骤逐一排查可能的问题,从而解决打开网络摄像头黑屏的情况。
根据你提供的代码,使用GStreamer命令方式打开网络摄像头出现黑屏的问题可能是由于以下原因:
GStreamer插件缺失:确保已正确安装和配置了GStreamer,并且所需的插件已正确安装。可以尝试使用gst-launch-1.0
命令行工具直接运行相同的GStreamer命令,看是否能够正常获取视频流。
缓冲区延迟设置:在你的代码中,你设置了latency=0
,这可能导致视频流的延迟较低导致黑屏。你可以尝试增加延迟值,例如将latency=200
修改为latency=500
,看是否有改善。
硬件或网络问题:确保网络摄像头的连接正常,可以通过其他工具或软件测试网络摄像头是否能够正常获取视频流。另外,也可以尝试使用本地文件(如测试视频文件)替代网络摄像头进行测试,看是否能够正常显示。
OpenCV版本兼容性:确保你使用的OpenCV版本与GStreamer和相关库的版本兼容。不同版本的OpenCV可能对GStreamer的支持存在一些差异。
如果以上方法仍无法解决问题,可以尝试使用其他方法来打开网络摄像头,如使用RTSP协议的URL,或者使用其他库如FFmpeg来处理视频流。此外,你也可以查看OpenCV的文档和社区论坛,寻找类似问题的解决方案或其他用户的经验分享。