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;