Qt获取大华摄像头监控画面(RTSP流方式)

一、与摄像头建立连接

1.RTSP格式

//格式
rtsp://username:password@<address>:<port>/Streaming/Channels<id>?channel=1&subtype=0
//举例
rtsp://admin:admin123456@10.0.10.21:554/cam/realmonitor?channel=1&subtype=0
username摄像机用户名
password摄像机密码
摄像机ip地址
RTSP端口(554:默认值)
Channels通道号
channel=1&subtype=0码流类型(此为主码流,主码流比子码流清晰,子码流适用于低带宽网络的传输)

2.测试连接可行性(使用VLC media player)

1.打开VLC

打开VLC

2.打开网络串流(Ctrl + N)

打开网络串流

3.输入rtsp://admin:admin123456@10.0.10.21:554/cam/realmonitor?channel=1&subtype=0,点击播放

在这里插入图片描述

4.观察是否有监控画面显示。如果没有,检查大华摄像头是否正常启动;如果有监控画面,说明连接可正常建立,获取大华监控画面具有可行性。

二、连接、接收视频帧

1.rtsp地址

std::string url = "rtsp://admin:admin123456@10.0.10.21:554/cam/realmonitor?channel=1&subtype=0";

2.声明

cv::VideoCapture m_capture; //!< 用于帧捕获的对象
cv::Mat m_frame;        //!< 捕获到的帧
cv::Mat m_buffFrame;    //!< 缓存的非空白帧

3.建立连接

void DefaultCamera::init()
{
	try
    {
        m_capture.open(url);
    }
    catch (const std::exception &e)
    {
        std::cerr << e.what() << std::endl;
    }

    if (m_capture.isOpened())
    {
        std::cout << "[DefaultCamera] is opened" << std::endl;
        m_run = true;
        // 捕获成功, 于是开始实时读取帧数据
        std::thread _t(&DefaultCamera::readFrame, this);
        _t.detach();
    }
    else
    {
        std::cout << "[DefaultCamera] is not opened" << std::endl;
    }
}

4.接收帧

void DefaultCamera::readFrame()
{
    bool _error = m_capture.read(m_frame);
    if (m_frame.empty())
        m_frame = m_buffFrame;
    else
        m_buffFrame = m_frame;
}

5.提供接口

cv::Mat DefaultCamera::getCurrentFrame()
{
    return m_frame.clone();
}

三、将视频帧转成图片

1.调用接口获取最新帧

QImage exit_image = cameraToImage(exitCamera->getCurrentFrame());

2.帧转成图片

QImage EntranceExitCamera::cameraToImage(const cv::Mat& cvImg)
{
	QImage qImg;
	int _type = cvImg.type();//int channels = cvImg.channels();
	if (_type == CV_8UC3)       //三通道彩色图像
	{
		cv::cvtColor(cvImg, cvImg, CV_BGR2RGB);
		qImg = QImage((const unsigned char*)(cvImg.data), cvImg.cols, cvImg.rows, static_cast<int>(cvImg.step), QImage::Format_RGB888).copy();
	}
	else if (_type == CV_8UC1)  //单通道灰度图
	{
		qImg = QImage((const unsigned char*)(cvImg.data), cvImg.cols, cvImg.rows, static_cast<int>(cvImg.step), QImage::Format_Grayscale8).copy();
	}
	else                        //默认按照四通道RGBA处理
	{
		cv::cvtColor(cvImg, cvImg, CV_BGRA2RGBA);
		qImg = QImage((const unsigned char*)(cvImg.data), cvImg.cols, cvImg.rows, static_cast<int>(cvImg.step), QImage::Format_RGBA8888).copy();
	}
	return qImg;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值