Я хочу снимать изображения с 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
Как исправить эту проблему? Проблема связана с моим кодом и с использованием библиотек или моей камеры?
Вы пытались использовать другой поток вашей IP-камеры? Я также предлагаю настроить параметры потока (разрешение, частота кадров, профили h264 и т. Д.), Возможно, полоса пропускания не может обслуживать текущие настройки. Что вы испытываете, когда открываете поток непосредственно в VLC? – Kornel
@Kornel Я пробовал все возможные URL-адреса моей камеры, используя ее документацию. У них есть указанная ошибка. –
@Kornel Как вы полагаете, я изменил параметры камеры, уменьшил разрешение и частоту кадров, но не стал играть. Я также открыл свой поток с помощью программы VLC. Некоторые из его фреймов повреждены. –