OpenCV и GoPro — пустые кадры в потоке VideoCapture

У меня GoPro Hero 3+ (черный), который подключен к карте видеозахвата (AverMedia Game Broadcaster HD). Я просто хочу получить видеопоток в OpenCV. С веб-камерой Logitech проблем нет. Используемый код ниже.

VideoCapture cap;
cap.open(0);

waitKey(300);

//cap.set(CV_CAP_PROP_FRAME_WIDTH, 1280);
//cap.set(CV_CAP_PROP_FRAME_HEIGHT, 720);

if (cap.isOpened()){
cout << "Cam identified" << endl;
}

namedWindow("dst", 1);

while (1){

Mat frame;

if (!cap.read(frame)) {
std::cout << "Unable to read frame from video stream" << std::endl;
continue;
}

imshow("dst", frame);

[...]

}

С GoPro происходит следующее: OpenCV может открывать VideoCapture («Идентифицирован Cam»), но не может читать какие-либо кадры (только серый экран и вывод: «Невозможно прочитать кадр из видеопотока»). Я также проверил это с помощью frame.empty () ;.

Я знаю, что карта видеозахвата работает правильно, потому что Unity без проблем открывает WebCamTexture с потоком GoPro. Я читал о проблемах с кодеками в OpenCv и поэтому уже пытался скомпилировать OpenCV с поддержкой FFMPEG. Теперь записанные MP4-видео GoPro могут отображаться, но поток по-прежнему не работает.

Я использую OpenCV 2.48, Windows 7 и Visual Studio 2013.


РЕДАКТИРОВАТЬ: Вот код решения libVLC:

struct ctx
{
uint8_t* pixeldata;
std::mutex imagemutex;
};

static void display(void *data, void *id);
static void unlock(void *data, void *id, void *const *p_pixels);
static void *lock(void *data, void **p_pixels);

struct ctx ctx;

libvlc_instance_t *inst;
libvlc_media_player_t *mp;
libvlc_media_t *m;

int main(int argc, char* argv[])
{
ctx.pixeldata = new uint8_t[1280 * 720 * 3];

char const *vlc_argv[] =
{
"-vvv",
"--no-audio", /* skip any audio track */
"--no-xlib", /* tell VLC to not use Xlib */
};

int vlc_argc = sizeof(vlc_argv) / sizeof(*vlc_argv);
inst = libvlc_new(vlc_argc, vlc_argv);

const char *options[] =
{
":dshow-vdev=AVerMedia HD Capture",
":dshow-adev=none",
//":dshow-size=1280x720",
":dshow-fps=24",
":dshow-chroma=YUY2",
":dshow-video-input=1",
":dshow-video-output=1",
":dshow-aspect-ratio=16\:9",
":live-caching=80",
NULL
};

m = libvlc_media_new_location(inst, "dshow://");
for (const char **opt = options; *opt; opt++)
libvlc_media_add_option(m, *opt);

mp = libvlc_media_player_new_from_media(m);
libvlc_media_release(m);
libvlc_video_set_callbacks(mp, lock, unlock, display, &ctx);
libvlc_video_set_format(mp, "RV24", 1280, 720, 1280 * 3);
libvlc_media_player_play(mp);

namedWindow("all", 1);

Mat frame(720, 1280, CV_8UC3);

while (1){

ctx.imagemutex.lock();
memcpy(gesamt.data, ctx.pixeldata, 1280 * 720 * sizeof(uint8_t) * 3);
ctx.imagemutex.unlock();

imshow("all", gesamt);

if (waitKey(30) == 27) //wait for 'esc' key press for 30ms. If 'esc' key is pressed, break loop
{
cout << "esc key is pressed by user" << endl;
break;
}

}

libvlc_media_player_stop(mp);
libvlc_media_player_release(mp);
libvlc_release(inst);
delete[] ctx.pixeldata;

return 0;
}

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;
ctx->imagemutex.unlock();
assert(id == NULL);
}

void *lock(void *data, void **p_pixels){
struct ctx *ctx = (struct ctx*)data;
ctx->imagemutex.lock();
*p_pixels = ctx->pixeldata;
return NULL;
}

4

Решение

У меня были те же проблемы, когда я пытался транслировать экшн-камеру Sony через карту захвата Avermedia. Похоже, что одним из быстрых решений является использование DVDrive, благодаря которому вывод вашей карты захвата выглядит как веб-камера. Я имел успех, используя это в качестве обходного пути.

1

Другие решения


По вопросам рекламы [email protected]