2016-09-08 3 views
2

Я хочу снимать изображения с IP-камеры. Я работаю в visual studio 2012. Сначала я использовал openCV для подключения к нему. Вот мой код.Снять изображение с ip-камеры

#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/core/core.hpp" 
#include "opencv2/opencv.hpp" 

int main() 
{ 
cv::VideoCapture vcap; 

const std::string videoStreamAddress = "rtsp://admin:[email protected]/snl/live/1/1/stream1.cgi"; 

if (!vcap.open(videoStreamAddress)) 
{ 
    printf("camera is null\n"); 
    return -1; 
} 
else 
{ 
    cv::Mat image; 
    cv::namedWindow("Video", CV_WINDOW_AUTOSIZE); 

    while(1) 
    { 

     vcap >> image; 
     imshow("Video", image); 
     if(cv::waitKey(10) == 99) break; 
    } 
} 

cv::waitKey(1000); 
return 0; 
} 

Это показывает поток. Но некоторые из его изображений имеют искажения. Я думаю, что это из-за ошибки декодирования. Ошибка заключается в следующем:

[h264 @ 00decfe0] error while decoding MB 37 22, bytestream <td> 

Чтобы решить эту ошибку я пишу другой код, вдохновленный от http://answers.opencv.org/question/65932/how-to-stream-h264-video-with-rtsp-in-opencv-partially-answered/. Он использует libVLC для получения потока. вот мой второй код.

#include "opencv2/opencv.hpp" 
#include "vlc/libvlc.h" 
#include "vlc/libvlc_media.h" 
#include "vlc/libvlc_media_player.h" 

#include "ctime" 
#include "Windows.h" 
#include "string" 

struct ctx 
{ 
    IplImage* image; 
    HANDLE mutex; 
    uchar* pixels; 
}; 

void *lock(void *data, void**p_pixels) 
{ 
    struct ctx *ctx = (struct ctx*)data; 
    WaitForSingleObject(ctx->mutex, INFINITE); 
    *p_pixels = ctx->pixels; 
    return NULL; 

} 
void display(void *data, void *id){ 
    (void) data; 
    assert(id == NULL); 
} 
void unlock(void *data, void *id, void *const *p_pixels){ 
    struct ctx *ctx = (struct ctx*)data; 
    /* VLC just rendered the video, but we can also render stuff */ 
    uchar *pixels = (uchar*)*p_pixels; 
    cvShowImage("image", ctx->image); 
    ReleaseMutex(ctx->mutex); 
    assert(id == NULL); /* picture identifier, not needed here */ 
} 

int main() 
{ 
    // VLC pointers 
    libvlc_instance_t *vlcInstance; 
    libvlc_media_player_t *mp; 
    libvlc_media_t *media; 

    const char * const vlc_args[] = { 
    "-I", "dummy", // Don't use any interface 
    "--ignore-config", // Don't use VLC's config 
    "--extraintf=logger", // Log anything 
    "--verbose=2", // Be much more verbose then normal for debugging purpose 
    }; 

    vlcInstance = libvlc_new(sizeof(vlc_args)/sizeof(vlc_args[0]), vlc_args); 
    media = libvlc_media_new_location(vlcInstance, "rtsp://admin:[email protected]/snl/live/1/1/stream1.cgi"); 

    mp = libvlc_media_player_new_from_media(media); 
    libvlc_media_release(media); 
    context->mutex = CreateMutex(NULL, FALSE, NULL); 
    context->image = new Mat(VIDEO_HEIGHT, VIDEO_WIDTH, CV_8UC3); 
    context->pixels = (unsigned char *)context->image->data; 

    // show blank image 
    imshow("test", *context->image); 

    libvlc_video_set_callbacks(mp, lock, unlock, display, context); 
    libvlc_video_set_format(mp, "RV24", VIDEO_WIDTH, VIDEO_HEIGHT, VIDEO_WIDTH * 24/8); // pitch = width * BitsPerPixel/8 

    int ii = 0; 
    int key = 0; 
    while(key != 27) 
    { 
     ii++; 
     if (ii > 5) 
     { 
      libvlc_media_player_play(mp); 
     } 
     float fps = libvlc_media_player_get_fps(mp); 
     //printf("fps:%f\r\n",fps); 
     key = waitKey(100); // wait 100ms for Esc key 
    } 

    libvlc_media_player_stop(mp); 

    return 0; 

} 

Но у него почти такая же ошибка. Некоторые пиксели теряются, а изображения имеют искажения.

[h264 @ 02a3b660] Frame num gap 6 4 
[h264 @ 02a42220] no picture oooo 

Как исправить эту проблему? Проблема связана с моим кодом и с использованием библиотек или моей камеры?

+0

Вы пытались использовать другой поток вашей IP-камеры? Я также предлагаю настроить параметры потока (разрешение, частота кадров, профили h264 и т. Д.), Возможно, полоса пропускания не может обслуживать текущие настройки. Что вы испытываете, когда открываете поток непосредственно в VLC? – Kornel

+0

@Kornel Я пробовал все возможные URL-адреса моей камеры, используя ее документацию. У них есть указанная ошибка. –

+0

@Kornel Как вы полагаете, я изменил параметры камеры, уменьшил разрешение и частоту кадров, но не стал играть. Я также открыл свой поток с помощью программы VLC. Некоторые из его фреймов повреждены. –

ответ

1

им работать на каком-то проекте, как вы, это ошибка, потому что у него перебор openCV сделки с H264, я предлагаю вам использовать библиотеку VLC, как указано в here, и потому что вы используете VS2012 вы можете использовать VLCDotNet в ваших вариантах project.other является FFmpeg , aforge, которые совместимы с H264, еще больше от вашего имени. Я понимаю, что вы иранский. Хороший замок с кодом.

Смежные вопросы