基于大华SDK的二次开发,用于网络摄像头图像的实时显示和捕获(附源码) 您所在的位置:网站首页 大华摄像头使用寿命 基于大华SDK的二次开发,用于网络摄像头图像的实时显示和捕获(附源码)

基于大华SDK的二次开发,用于网络摄像头图像的实时显示和捕获(附源码)

2024-03-30 03:23| 来源: 网络整理| 查看: 265

目录

1. 文章背景

2. 主要模块

2.1 初始化SDK     

2.2 登录账号

2.3 捕获图片

2.4 实时显示

2.5 断开时释放

2.6 回调函数

3. 源代码

3.1 头文件

3.2 源文件

1. 文章背景

        项目中需要使用大华的网络摄像头,之前为了图方便,我是通过opencv打开rtsp地址,从而显示和存图,但由于客户后期更换了摄像头,且希望采图效率更高,预估rtsp难以达到,所以考虑从大华官方SDK下手,就有了这篇文章。

2. 主要模块

        其实官方的例程已经写得很详细了,不过官方的Demo是用MFC写的,考虑到一些朋友对MFC不是很熟(主要是指我自己 0-0),我就用qt c++写了这部分功能,因为基于QT,所以我的很多代码习惯是qt的,比如实时图像显示的窗体句柄,我是直接取的Qt上的一个QLbel的句柄。

2.1 初始化SDK     

        初始SDK:CLIENT_Init,就一个接口,没啥好说的。

// 初始化 SDK g_bNetSDKInitFlag = CLIENT_Init((fDisConnect)DisConnectFunc, 0); QString logInfo = QSC("SDK初始化%1。").arg(g_bSnapPictureFlag ? QSC("成功") : QSC("失败")); qDebug() call("haat_CameraConnect", ui->ip->text(), ui->port->text().toInt()); double result = status->result().toDouble(); #else double result = haat_CameraConnect(ui->ip->text(), ui->port->text().toInt()); #endif ui->textEdit->append(QSC("rpc登录句柄:%1\r\n全局变量登录句柄:%2\r\n").arg(result, 0, 'f', 0).arg(LoginHandle)); ui->btn_connect->setAutoFillBackground(true); ui->btn_connect->setFlat(true); pal = ui->btn_connect->palette(); if(result) pal.setColor(QPalette::Button, Qt::green); else pal.setColor(QPalette::Button, Qt::red); ui->btn_connect->setPalette(pal); ui->btn_connect->setText(result? "Disconnect" : "Connect"); ui->capture->setEnabled(result); ui->realdisplay->setEnabled(result); } else { #if defined ISRPC auto status = SERVICES->client(DHSDK)->call("haat_CameraDisconnect"); #else haat_CameraDisconnect(); #endif pal.setColor(QPalette::Button, Qt::yellow); ui->btn_connect->setPalette(pal); ui->btn_connect->setText("Connect"); ui->capture->setEnabled(false); ui->realdisplay->setEnabled(false); } } void MainWidget::on_capture_clicked() { if(ui->imagePath->text().isEmpty()) on_btn_browse_clicked(); QTime startTime = QTime::currentTime(); // rtsp协议拍照 // auto status = SERVICES->client(DHSDK)->call("haat_rtspCapture", ui->ip->text(), ui->channel->text().toInt(), imagePath); // DHSDK拍照 #if defined ISRPC auto status = SERVICES->client(DHSDK)->call("haat_SDKCapture"); bool isCap = status->result().toBool(); #else bool isCap = haat_SDKCapture(ui->channel->text().toInt()); #endif ui->showImage->setEnabled(isCap); ui->textEdit->append(QSC("图片拍照: %1").arg(isCap ? QSC("成功") : QSC("失败"))); QTime stopTime = QTime::currentTime(); int elapsed = startTime.msecsTo(stopTime); ui->textEdit->append(QSC("图片拍照耗时:%1 ms\r\n").arg(elapsed)); } void MainWidget::on_showImage_clicked() { QString imagePath = ui->imagePath->text(); QTime startTime = QTime::currentTime(); #if defined ISRPC auto status = SERVICES->client(DHSDK)->call("haat_CameraCapture", imagePath); int imageType = status->result().toInt(); #else int imageType = haat_CameraCapture(imagePath); #endif ui->textEdit->append(QSC("图片获取: %1").arg(imageType == -1 ? QSC("失败") : QSC("成功"))); QTime stopTime = QTime::currentTime(); int elapsed = startTime.msecsTo(stopTime); ui->textEdit->append(QSC("图片获取耗时:%1 ms\r\n").arg(elapsed)); showImageInLabel(ui->label_RealDisplay,imagePath); ui->showImage->setEnabled(false); } void MainWidget::showImageInLabel(QLabel* m_label, QString imagePath) { QPixmap Pix; Pix.load(imagePath); Pix= Pix.scaled(m_label->width(), m_label->height(), Qt::KeepAspectRatio, Qt::SmoothTransformation); m_label->setScaledContents(true); m_label->setPixmap(Pix); } void MainWidget::on_realdisplay_clicked() { if(ui->realdisplay->text() == "RealDisplay") { #if defined ISRPC auto status = SERVICES->client(DHSDK)->call("haat_RealDisplay", ui->channel->text().toInt()); bool result = status->result().toBool(); #else bool result = haat_RealDisplay(ui->channel->text().toInt()); #endif ui->realdisplay->setAutoFillBackground(true); ui->realdisplay->setFlat(true); pal = ui->realdisplay->palette(); if(result) pal.setColor(QPalette::Button, Qt::green); else pal.setColor(QPalette::Button, Qt::red); ui->realdisplay->setPalette(pal); ui->realdisplay->setText(result? "CloseDisplay" : "RealDisplay"); } else { #if defined ISRPC auto status = SERVICES->client(DHSDK)->call("haat_CloseDisplay"); #else haat_CloseDisplay(); #endif pal.setColor(QPalette::Button, Qt::yellow); ui->realdisplay->setPalette(pal); ui->realdisplay->setText("RealDisplay"); } } double MainWidget::getValue(QString value, int valueType) { QString resultSFRStr = value; QStringList resultSFRList = resultSFRStr.split(";"); QList SFRList = {}; for(QString temp : resultSFRList) if(!temp.isEmpty()) SFRList.append(temp.toDouble()); double result = -100; if(valueType == 0) { double numTemp = 0; for(double doubleTemp : SFRList) numTemp = numTemp + doubleTemp; result = numTemp / SFRList.size(); } else result = *std::min_element(SFRList.begin(), SFRList.end()); return result; } void MainWidget::on_btn_browse_clicked() { QString srcDirPath = QFileDialog::getExistingDirectory(this, QSC("选择Rtsp截取图片储存路径"), "/"); if (!srcDirPath.isEmpty()) ui->imagePath->setText(srcDirPath + QString("/cap%1.bmp").arg(ui->sbx_num->value())); } void MainWidget::on_sbx_num_valueChanged(int arg1) { QString imagePath = ui->imagePath->text(); if(!imagePath.isEmpty()) { QFileInfo appInfo(imagePath); QString newPath = appInfo.path() + QString("/cap%1.bmp").arg(arg1); ui->imagePath->setText(newPath); } } void MainWidget::on_cmb_ip_currentTextChanged(const QString &arg1) { ui->ip->setText(arg1); } void MainWidget::on_cmb_channel_currentTextChanged(const QString &arg1) { ui->channel->setText(arg1); } void MainWidget::on_tabWidget_currentChanged(int index) { QString configName = ":/Config/RedisDataInit.json"; QVariantMap redisData = HaatGlobalUtils::jsonfileToVariantMap(configName); } // ***************************大华SDK二次开发********************************* void MainWidget::h_capture(int channel) { if (!g_bNetSDKInitFlag) { g_bSnapPictureFlag = false; return; } if (!LoginHandle) { g_bSnapPictureFlag = false; return; } // 设置抓图回调函数 CLIENT_SetSnapRevCallBack(SnapRev, NULL); //事例中默认通道 ID 为 0、抓图模式为抓一幅图,用户可根据实际情况自行选择 int nChannelId = channel; int nSnapType = 0;// 抓图模式;-1:表示停止抓图, 0:表示请求一帧, 1:表示定时发送请求, 2:表示连续请求 // 发送抓图命令给前端设备 SNAP_PARAMS stuSnapParams; stuSnapParams.Channel = nChannelId; stuSnapParams.mode = nSnapType; stuSnapParams.CmdSerial = 0;//++g_nCmdSerial; // 请求序列号,有效值范围 0~65535,超过范围会被截断为 unsigned short g_bSnapPictureFlag = CLIENT_SnapPictureEx(LoginHandle, &stuSnapParams); QString logInfo = QSC("SDK抓图%1。").arg(g_bSnapPictureFlag? QSC("成功") : QSC("失败,错误码[%1]").arg(QString::number(CLIENT_GetLastError(), 16))); qDebug()


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有