1. 程式人生 > >opencv+qt通過CGI讀取網路攝像頭

opencv+qt通過CGI讀取網路攝像頭

工程程式碼:http://download.csdn.net/download/mjlsuccess/9461745

網路監控攝像頭比普通攝像頭的優勢在於它有云臺,可以調整角度。這兩天老闆讓我買個網路攝像頭看看效果如何,那麼這就涉及到監控攝像頭的二次開發問題,淘寶上買的大多支援二次開發。我買的這款使用的是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;
}

效果圖


相關推薦

opencv+qt通過CGI讀取網路攝像頭

工程程式碼:http://download.csdn.net/download/mjlsuccess/9461745 網路監控攝像頭比普通攝像頭的優勢在於它有云臺,可以調整角度。這兩天老闆讓我買個網路攝像頭看看效果如何,那麼這就涉及到監控攝像頭的二次開發問題,淘寶上買的大

OpenCV入門學習之讀取usb攝像頭影象,實時顯示

首先,新建一個.cpp的源程式檔案,例如,gedit test.cpp 在該檔案中新增以下程式: #include <opencv2/core/core.hpp> #include

Linux環境下使用V4L2+opencv以MJPEG格式讀取USB攝像頭並實時顯示

轉眼間,V4L2已經搞了很長時間,從最開始的一竅不通,到後來的漸漸熟悉,從最開始照貓畫虎的使用YUYV格式之間轉換,到後來使用MJPEG格式讀取,中間頗有周折。趁任務完成間隙,來簡單總結下V4L2的使用。(文章只主要寫了過程,完整程式已經附在最後) 有讀者要問,open

opencv學習筆記】一. 網路攝像頭視訊儲存

目標:將網路攝像頭的視訊流儲存在電腦中 #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <iostream>

Opencv讀取USB網路攝像頭無法顯示,影象為空,顯示黑色?

利用Opencv讀取電腦的攝像頭,程式碼如下,一直無法正常執行,搜尋網上的解決方案,均未解決。程式碼語法沒有錯誤,攝像頭也可以開啟,但是就是無法讀取當前幀影象 #include <opencv.hpp> using namespace cv; int main() { Vid

VLC播放攝像頭或者網路攝像頭通過rtsp流讀取視訊

#include <stdio.h>   #include <stdint.h>   #include <math.h>   #include <stdlib.h>   #include <assert.h>  

python+opencv 開啟網路攝像頭

# -*- coding: utf-8 -*- """ Created on Thu Nov 22 18:41:33 2018 #QQ群:476842922(歡迎加群討論學習 @author: Administrator """ #以下是最常用的讀取視訊流的方法 import cv2 url

ros indigo opencv獲取網路攝像頭報錯(尚未解決)

[h264 @ 0x7f928c5deca0] cabac decode of qscale diff failed at 46 48 [h264 @ 0x7f928c5deca0] error while decoding MB 46 48, bytestre

OpenCV網路攝像頭

 1  RTSP   RTSP (Real Time Streaming Protocol),是一種語法和操作類似 HTTP 協議,專門用於音訊和視訊的應用層協議。 和 HTTP 類似,RTSP 也使用 URL 地址。   海康網路攝像頭的 RTSP URL 格式如下:

openCV 呼叫網路攝像頭或本地攝像頭

openCV 呼叫網路攝像頭 所需要硬體及軟體環境 python3.6,一個網路攝像頭,openCV, # -*- coding: utf-8 -*- # @author leone # @desc 使用 python 的 openCV 獲取網路攝像頭的資料 # @version 2018-12-2

openCV 呼叫網路攝像頭

所需要硬體及軟體環境 python3.6,一個網路攝像頭,openCV, # -*- coding: utf-8 -*- # @author leone # @desc 使用 python 的 openCV 獲取網路攝像頭的資料 # @version 2018-12-23

opencv自學之旅 視訊讀取攝像頭讀取

opencv 可以很方便的讀取攝像頭,他有一個CvCapture結構體,可以用來操作攝像頭。 首先我們先了解下這個結構體。 1.讀取視訊檔案 cvCreateFileCapture(“檔案路徑”); 返回指標 CvCapture型別。 這個函式是讀取一個

opencv 網路攝像頭(webcamera)

opencv 開啟網路攝像頭 程式碼如下: #include <stdio.h> #include <iostream> #include "opencv/cv.h" #in

怎麽通過scanf讀取一個空白前的字符

pos log 姓名 輸入 printf style return sca *** 1 /************************************************************************* 2 > File Nam

通過 ContentResolver 讀取聯系人信息

tac ant cursor istview div ani item getc ext 1、首先動態獲取 讀取聯系人信息權限 <1>配置文件中聲明對應權限<uses-permission android:name="android.permissio

Win7下 OpenCV+Qt開發環境搭建

tro enc 銷毀 vid 使用 detect ack text [] 1、所需軟件工具: (1)OpenCV開發庫,2.4.9版;包括源文件(source文件夾)和編譯後的文件(build文件夾),但最好自己使用CMake又一次編譯。否則easy出錯。 (2

通過python讀取ini配置文件

char lock 實戰 mysq 測試 exception val sel 配置 百度搜索:小強測試品牌 交流群:522720170 點擊右上角“關註”按鈕可以訂閱我們哦 轉發+點贊=支持 ini是啥 你可以理解為就是一個配置文件的統稱吧。比如test.conf,這

OpenCV--python---圖片的讀取顯示

details detail 筆記 tail opencv 顯示 bsp article enc openCV-Python筆記一:圖像的讀取、顯示和保存 http://blog.csdn.net/djcxym/article/details/52097812

Python通過xpath查找元素通過selenium讀取元素信息

class bdr 查找 blog 信息 style body type from #coding:utf-8 from selenium import webdriver import time url =‘http://www.baidu.com‘ driver =

Java通過jxl讀取Excel

except 通過 writable student jxl tco true 5.x workbook package com.hd.all.test.testjava; import java.io.File; import java.io.IOException;