OpenCV с сетевыми камерами

Почему бы не преобразовать строку в целое число формы YYYYMMDDHHMMSS? Каждое приращение времени создавало бы большее целое число, и вы могли бы фильтровать целые числа, а не беспокоиться о преобразовании в время ISO.

23
задан Grifo 3 April 2009 в 08:15
поделиться

5 ответов

Протокол RTSP не работал для меня. mjpeg сработал с первой попытки. Я предполагаю, что он встроен в мою камеру (Dlink DCS 900).

Синтаксис найден здесь: http://answers.opencv.org/question/133/how-do-i-access-an-ip-camera/

Я не сделал нужно скомпилировать OpenCV с поддержкой ffmpg.

3
ответ дан john ktejik 29 November 2019 в 01:52
поделиться
#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);
}
10
ответ дан RvdK 29 November 2019 в 01:52
поделиться

Используйте 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

1
ответ дан 29 November 2019 в 01:52
поделиться

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");
5
ответ дан 29 November 2019 в 01:52
поделиться

Программирование на интерфейс, а не реализация:

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  

Можно легко использовать некоторые частные модификаторы для интерфейсов с различными контрактами. Это решение простое, и ИМО это подходит для вашей задачи.
И если вы думаете, что будет легко сделать некоторые действия, которые вы пытаетесь скрыть/ограничить, вы правы. И то же самое с любым возможным способом.

-121--4222879-

Ассемблер

Протестирован с помощью 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

3
ответ дан 29 November 2019 в 01:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: