Почему бы не преобразовать строку в целое число формы YYYYMMDDHHMMSS? Каждое приращение времени создавало бы большее целое число, и вы могли бы фильтровать целые числа, а не беспокоиться о преобразовании в время ISO.
Протокол RTSP не работал для меня. mjpeg сработал с первой попытки. Я предполагаю, что он встроен в мою камеру (Dlink DCS 900).
Синтаксис найден здесь: http://answers.opencv.org/question/133/how-do-i-access-an-ip-camera/
Я не сделал нужно скомпилировать OpenCV с поддержкой ffmpg.
#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);
}
Используйте ffmpeglib для соединения с потоком.
Эти функции могут быть полезными. Но смотрите в документах
av_open_input_stream(...);
av_find_stream_info(...);
avcodec_find_decoder(...);
avcodec_open(...);
avcodec_alloc_frame(...);
Вам было бы нужно немного алгоритма для получения полного кадра, который доступен здесь
http://www.dranger.com/ffmpeg/tutorial01.html
После того как Вы получаете кадр, Вы могли скопировать видеоданные (для каждой плоскости в случае необходимости) в IplImage, который является объектом изображения OpenCV.
Можно создать IplImage с помощью чего-то как...
IplImage *p_gray_image = cvCreateImage(size, IPL_DEPTH_8U, 1);
После того как у Вас есть IplImage, Вы могли выполнить все виды операций изображения, доступных в lib OpenCV
OpenCV может быть скомпилирован с поддержкой FFMPEG. Из ./ configure --help :
--with-ffmpeg use ffmpeg libraries (see LICENSE) [automatic]
Затем вы можете использовать cvCreateFileCapture_FFMPEG для создания CvCapture, например, с URL-адресом потока MJPG камеры.
Я использую это для захвата кадры с камеры AXIS:
CvCapture *capture =
cvCreateFileCapture_FFMPEG("http://axis-cam/mjpg/video.mjpg?resolution=640x480&req_fps=10&.mjpg");
Программирование на интерфейс, а не реализация:
public interface IFoo
{
int MyProp { get; }
}
public interface IFooWithSetter
{
int MyProp { get; set; }
}
public class FooImplementation : IFoo, IFooWithSetter
{
public int MyProp
{
get { return 100; }
set { }
}
}
Пример использования:
IFoo var1 = new FooImplementation(); // only getter is available in var1
IFooWithSetter var2 = (IFooWithSetter) var1; // setter and getter is available in var2
Можно легко использовать некоторые частные модификаторы для интерфейсов с различными контрактами. Это решение простое, и ИМО это подходит для вашей задачи.
И если вы думаете, что будет легко сделать некоторые действия, которые вы пытаетесь скрыть/ограничить, вы правы. И то же самое с любым возможным способом.
Ассемблер
Протестирован с помощью WinXP DOS box (cmd.exe):
xchg cx,bp
std
mov al,2
rep stosb
inc cl
l0: ; to save a byte, I've encoded the instruction to exit the program into the
; low byte of the offset in the following instruction:
lea si,[di+01c3h]
push si
l1: mov dx,bp
mov ah,6
int 21h
jz l2
mov bl,al
shr byte ptr [di+bx],cl
jz l1
inc si
mov [si],bx
jmp l1
l2: pop si
l3: inc si
mov bl,[si]
cmp bl,bh
je l0+2
cmp [di+bx],cl
jne l3
mov dl,bl
mov ah,2
int 21h
jmp l3
Сборка до 53 байт. Считывает стандартные входные данные и записывает результаты в стандартные выходные данные, например:
programname < input > output
-121--2090866- Я просто делаю это так:
CvCapture *capture = cvCreateFileCapture("rtsp://camera-address");
Также убедитесь, что эта DLL доступна во время выполнения, иначе cvCreateFileCapture вернет NULL
opencv_ffmpeg200d.dll
Камере также необходимо разрешить несанкционированный доступ, обычно установленный через веб-интерфейс. Формат MJPEG работал через rtsp, но MPEG4 этого не сделал.
hth
Si