OpenCVとネットワークカメラ
-
23-08-2019 - |
質問
Windows で openCV 1.1pre1 を使用しています。ネットワーク カメラを持っており、openCV からフレームを取得する必要があります。このカメラは、RTSP 経由で標準の mpeg4 ストリーム、または http 経由で mjpeg をストリーミングできます。openCV で ffmpeg を使用することについて話している多くのスレッドを見てきましたが、それを機能させることができません。
openCV を使用して IP カメラからフレームを取得するにはどうすればよいですか?
ありがとう
アンドレア
解決
RTSPプロトコルは私のために動作しませんでした。 MJPEGは、最初の試みを働きました。私はそれが私のカメラ(DLINK DCS 900)に内蔵されていると仮定します。
の構文は、こちらをご覧ください: http://answers.opencv.org/質問/ 133 /どのように-DO-I-アクセス-IPカメラ/ の
私はffmpgサポートしてOpenCVのをコンパイルする必要はありませんでした。
他のヒント
フレームを取得するための C++ コードを同封しました。OpenCV バージョン 2.0 以降が必要です。このコードでは、古い IplImage 構造よりも優先される cv::mat 構造を使用します。
#include "cv.h"
#include "highgui.h"
#include <iostream>
int main(int, char**) {
cv::VideoCapture vcap;
cv::Mat image;
const std::string videoStreamAddress = "rtsp://cam_address:554/live.sdp";
/* it may be an address of an mjpeg stream,
e.g. "http://user:pass@cam_address:8081/cgi/mjpg/mjpg.cgi?.mjpg" */
//open the video stream and make sure it's opened
if(!vcap.open(videoStreamAddress)) {
std::cout << "Error opening video stream or file" << std::endl;
return -1;
}
//Create output window for displaying frames.
//It's important to create this window outside of the `for` loop
//Otherwise this window will be created automatically each time you call
//`imshow(...)`, which is very inefficient.
cv::namedWindow("Output Window");
for(;;) {
if(!vcap.read(image)) {
std::cout << "No frame" << std::endl;
cv::waitKey();
}
cv::imshow("Output Window", image);
if(cv::waitKey(1) >= 0) break;
}
}
アップデート H.264 RTSP ストリームからフレームを取得できます。詳細についてはカメラ API を検索して、URL コマンドを取得します。たとえば、Axis ネットワーク カメラの場合、URL アドレスは次のようになります。
// H.264 stream RTSP address, where 10.10.10.10 is an IP address
// and 554 is the port number
rtsp://10.10.10.10:554/axis-media/media.amp
// if the camera is password protected
rtsp://username:password@10.10.10.10:554/axis-media/media.amp
#include <stdio.h>
#include "opencv.hpp"
int main(){
CvCapture *camera=cvCaptureFromFile("http://username:pass@cam_address/axis-cgi/mjpg/video.cgi?resolution=640x480&req_fps=30&.mjpg");
if (camera==NULL)
printf("camera is null\n");
else
printf("camera is not null");
cvNamedWindow("img");
while (cvWaitKey(10)!=atoi("q")){
double t1=(double)cvGetTickCount();
IplImage *img=cvQueryFrame(camera);
double t2=(double)cvGetTickCount();
printf("time: %gms fps: %.2g\n",(t2-t1)/(cvGetTickFrequency()*1000.), 1000./((t2-t1)/(cvGetTickFrequency()*1000.)));
cvShowImage("img",img);
}
cvReleaseCapture(&camera);
}
OpenCVのは、FFMPEGをサポートするようにコンパイルすることができます。
./のconfigure --help のから--with-ffmpeg use ffmpeg libraries (see LICENSE) [automatic]
あなたはその後、例えばとCvCaptureを作成するには、のcvCreateFileCapture_FFMPEG の使用することができますカメラのMJPGストリームのURLます。
私は、AXISカメラからフレームをつかむために、これを使用します:
CvCapture *capture =
cvCreateFileCapture_FFMPEG("http://axis-cam/mjpg/video.mjpg?resolution=640x480&req_fps=10&.mjpg");
私はちょうどこのようにそれを実行します。
CvCapture *capture = cvCreateFileCapture("rtsp://camera-address");
また、このDLLはNULLを返しますランタイム他cvCreateFileCaptureで利用可能であることを確認します。
opencv_ffmpeg200d.dll
カメラは、通常、そのWebインターフェイスを介して設定された、あまりにも認証されていないアクセスを許可する必要があります。 MJPEG形式は、RTSPを経由して働いていたが、MPEG4はしませんでした。
HTH
Siの
ストリームに接続するためにffmpeglibを使用します。
これらの機能は有用であり得ます。しかし、ドキュメントで見てみましょう。
av_open_input_stream(...);
av_find_stream_info(...);
avcodec_find_decoder(...);
avcodec_open(...);
avcodec_alloc_frame(...);
あなたは完全なフレームを取得するには少しアルゴが必要になり、 これは、ここに提供されています。
http://www.dranger.com/ffmpeg/tutorial01.html
にあなたが(必要に応じて各平面のために)あなたがビデオデータをコピーすることができ、フレームを取得したら、 OpenCVの画像オブジェクトであるIplImageへ。
あなたが何かを使用してIplImageへを作成することができますように...
IplImage *p_gray_image = cvCreateImage(size, IPL_DEPTH_8U, 1);
あなたはIplImageへを持ってたら、OpenCVのlibに利用可能な画像の操作のすべてのソートを行うことができます。