これは Axis IP カメラですか? いずれにせよ、 cvCreateFileCapture_FFMPEGを使用して OpenCV を使用してデコードできるMPEG4 RTSP ストリームを提供するほとんどの IP カメラ。ただし、ffmpeg デコーダーのMJPEGコーデックには、広く知られている未解決の問題があります。次のようなエラーが表示されるはずです
[ingenient @ 0x97d20c0]Could not find codec parameters (Video: mjpeg)
オプション 1 : opencv、libcurl、および libjpeg を使用する
opencv で mjpeg ストリームを表示するには、次の実装を見てください。
http://www.eecs.ucf.edu/~rpatrick/code/onelinksys.c
または
http://cse.unl.edu/~rpatrick/code/onelinksys.c
オプション 2: gstreamer の使用 (opencv なし)
jpeg画像を表示または保存するだけの場合は、gstreamerを見ることをお勧めします
MJPEG ストリームを表示するには、メディア パイプライン文字列を次のように実行します。
gst-launch -v souphttpsrc location="http://[ip]:[port]/[dir]/xxx.cgi" do-timestamp=true is_live=true ! multipartdemux ! jpegdec ! ffmpegcolorspace ! autovideosink
RTSPの場合
gst-launch -v rtspsrc location="rtsp://[user]:[pass]@[ip]:[port]/[dir]/xxx.amp" debug=1 ! rtpmp4vdepay ! mpeg4videoparse ! ffdec_mpeg4 ! ffmpegcolorspace! autovideosink
C API を使用するには、次を参照してください。
http://wiki.maemo.org/Documentation/Maemo_5_Developer_Guide/Using_Multimedia_Components/Camera_API_Usage
簡単な例として、gstreamer C API メディア パイプラインを構築するための rtsp に関する私の他の投稿を見てください (これは gst-launch 文字列と同じですが、C API として実装されています)。
python-gstreamer で RTSP を再生する
MJPEG ストリームを複数の画像としてパイプラインに保存するには (垂直フリップBINを配置し、 PADSを前の BINS と次のBINSに接続して、より洗練されたものにしましょう)
gst-launch souphttpsrc location="http://[ip]:[port]/[dir]/xxx.cgi" do-timestamp=true is_live=true ! multipartdemux ! jpegdec ! videoflip method=vertical-flip ! jpegenc ! multifilesink location=image-out-%05d.jpg
gst-opencvも一見の価値があるかもしれません
アップデート:
オプション 3: gstreamer、名前付きパイプ、および opencv を使用する
Linux では、mjpeg ストリームを取得して mpeg4 に変換し、名前付きパイプにフィードすることができます。次に、opencv で名前付きパイプからデータを読み取ります
手順 1. 名前付きパイプを作成する
mkfifo stream_fifo
ステップ 2. opencvvideo_test.c を作成する
// compile with gcc -ggdb `pkg-config --cflags --libs opencv` opencvvideo_test.c -o opencvvideo_test
#include <stdio.h>
#include "highgui.h"
#include "cv.h"
int main( int argc, char** argv){
IplImage *frame;
int key;
/* supply the AVI file to play */
assert( argc == 2 );
/* load the AVI file */
CvCapture *capture = cvCreateFileCapture(argv[1]) ;//cvCaptureFromAVI( argv[1] );
/* always check */
if( !capture ) return 1;
/* get fps, needed to set the delay */
int fps = ( int )cvGetCaptureProperty( capture, CV_CAP_PROP_FPS );
int frameH = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT);
int frameW = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH);
/* display video */
cvNamedWindow( "video", CV_WINDOW_AUTOSIZE );
while( key != 'q' ) {
double t1=(double)cvGetTickCount();
/* get a frame */
frame = cvQueryFrame( capture );
double t2=(double)cvGetTickCount();
printf("time: %gms fps: %.2g\n",(t2-t1)/(cvGetTickFrequency()*1000.), 1000./((t2-t1)/(cvGetTickFrequency()*1000.)));
/* always check */
if( !frame ) break;
/* display frame */
cvShowImage( "video", frame );
/* quit if user press 'q' */
key = cvWaitKey( 1000 / fps );
}
/* free memory */
cvReleaseCapture( &capture );
cvDestroyWindow( "video" );
return 0;
}
ステップ 3. gstreamer を使用して MJPEG から MPEG4 に変換する準備をする (着信フレームのレートが重要)
gst-launch -v souphttpsrc location="http://<ip>/cgi_bin/<mjpeg>.cgi" do-timestamp=true is_live=true ! multipartdemux ! jpegdec ! queue ! videoscale ! 'video/x-raw-yuv, width=640, height=480'! queue ! videorate ! 'video/x-raw-yuv,framerate=30/1' ! queue ! ffmpegcolorspace ! 'video/x-raw-yuv,format=(fourcc)I420' ! ffenc_mpeg4 ! queue ! filesink location=stream_fifo
ステップ 4. OpenCV でストリームを表示する
./opencvvideo_test stream_fifo