Opencv+qtネットワークカメラをCGIで読み込む


エンジニアリングコード:http://download.csdn.net/download/mjlsuccess/9461745
ネットワークモニタリングカメラは、通常のカメラよりも雲台があり、角度を調整できる点がメリットです.この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;
}

効果図