Opencv+qtネットワークカメラをCGIで読み込む
3722 ワード
エンジニアリングコード:http://download.csdn.net/download/mjlsuccess/9461745
ネットワークモニタリングカメラは、通常のカメラよりも雲台があり、角度を調整できる点がメリットです.この2、3日、ボスは私にネットカメラを買って効果を見てもらいました.それでは、監視カメラの二次開発問題に関連しています.宝を洗う上で買った多くの人は二次開発をサポートしています.私が買ったのはCGIコマンドで、簡単に言えばHTTPプロトコルです.マニュアルを見ると、転送される画像データストリームはjpegタイプで、OpenCVを使用して画像を読み取る場合、imreadを使用するのが一般的ですが、imreadはハードディスクからしかデータを読めません.メモリでデータを読むことができる関数が必要です.この場合、imdecode関数(OpenCVは便利です)を使用します.インタフェースとHTTP通信についてはQtで済ませます.
貼り付けコード:
http_test.cpp
効果図
ネットワークモニタリングカメラは、通常のカメラよりも雲台があり、角度を調整できる点がメリットです.この2、3日、ボスは私にネットカメラを買って効果を見てもらいました.それでは、監視カメラの二次開発問題に関連しています.宝を洗う上で買った多くの人は二次開発をサポートしています.私が買ったのはCGIコマンドで、簡単に言えばHTTPプロトコルです.マニュアルを見ると、転送される画像データストリームはjpegタイプで、OpenCVを使用して画像を読み取る場合、imreadを使用するのが一般的ですが、imreadはハードディスクからしかデータを読めません.メモリでデータを読むことができる関数が必要です.この場合、imdecode関数(OpenCVは便利です)を使用します.インタフェースとHTTP通信についてはQtで済ませます.
貼り付けコード:
#ifndef HTTP_TEST_H
#define HTTP_TEST_H
#include <QtWidgets/QMainWindow>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QUrl>
#include <QFile>
#include <QTextStream>
#include <opencv.hpp>
#include "ui_http_test.h"
using namespace cv;
class Http_test : public QMainWindow
{
Q_OBJECT
public:
Http_test(QWidget *parent = 0);
~Http_test();
public slots:
void httpReadyRead();
void startRequst();
void stopRequst();
void httpFinished();
private:
Ui::Http_testClass ui;
QNetworkAccessManager qnam;
QNetworkReply * reply;
QUrl url;
private:
int size;
bool flag;
Mat showImage;
Mat bufImage;
int count;
};
#endif // HTTP_TEST_H
http_test.cpp
#include <QByteArray>
#include <QPushButton>
#include <QMessageBox>
#include <QNetworkRequest>
#include "http_test.h"
Http_test::Http_test(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
connect(ui.startHttp, &QPushButton::clicked, this, &Http_test::startRequst);
connect(ui.stopHttp, &QPushButton::clicked, this, &Http_test::stopRequst);
ui.startHttp->setEnabled(true);
ui.stopHttp->setEnabled(false);
size = 0;
flag = 1;
count = 0;
}
Http_test::~Http_test()
{
httpFinished();
}
/*
HTTP , http TCP Wireshark
header + jpegstream ( byte )
header 59 :
--This String Content-type:image/jpeg Content-Length:35716
header 5 ,35716
header , jpeg 35716
*/
void Http_test::httpReadyRead()
{
QByteArray jpegStream = reply->readAll();
QByteArray str = "Length:";
int header_cnt=0, stream_cnt = 0;
int index;
//header_cnt-> , stream_cnt-> bytes
while((59*header_cnt + stream_cnt) < jpegStream.size())
{
if(flag)
{
index = jpegStream.indexOf(str, 59*header_cnt + stream_cnt);
if(index != -1)
{
size = (jpegStream.mid(index+7, 5)).toInt();
bufImage.create(1, size, CV_8UC1);
ui.textEdit->setText(QString("%1").arg(size));
flag = 0;
header_cnt++;
}
}
else
{
for (int k=59*header_cnt + stream_cnt; k<jpegStream.size(); k++)
{
bufImage.at<uchar>(0, count) = jpegStream.at(k);
count++;
stream_cnt++;
if(count == size)
{
showImage = imdecode(bufImage, CV_LOAD_IMAGE_ANYCOLOR);
imshow("jpegWin", showImage);
flag = 1;
size = 0;
count = 0;
break;
}
}
}
}
}
void Http_test::startRequst()
{
QString str = "http://192.168.0.50:88/cgi-bin/CGIStream.cgi?cmd=GetMJStream&usr=poss&pwd=poss";
str+= ui.lineEdit->text();
url = str;
reply = qnam.get(QNetworkRequest(url));
connect(reply, &QNetworkReply::finished, this, &Http_test::httpFinished);
connect(reply, &QNetworkReply::readyRead, this, &Http_test::httpReadyRead);
ui.startHttp->setEnabled(false);
ui.stopHttp->setEnabled(true);
}
void Http_test::stopRequst()
{
reply->abort();
ui.startHttp->setEnabled(true);
ui.stopHttp->setEnabled(false);
}
void Http_test::httpFinished()
{
reply->deleteLater();
reply = 0;
}
効果図