невозможно воспроизвести монохромный AVI-файл Y800 с использованием OpenCV в Stack Overflow

Я сталкиваюсь со следующей проблемой. Поскольку я хочу записывать и воспроизводить данные изображений RAW с камеры, в настоящее время я записываю изображения с использованием

VideoWriter outputVideo1("camera1.avi", CV_FOURCC('Y','8','0','0'), frameRate, frameSize, false);

Это прекрасно работает, и я могу воспроизвести видео файл с помощью проигрывателя VLC, например,
MediaInfo также подтверждает, что формат — GrayScale, а ID кодека — Y800.

К сожалению, когда я пытаюсь открыть этот файл в OpenCV, используя

VideoCapture cap1("camera1.avi");
Mat frame1;
for(;;)
{
cap1 >> frame1;
}

программа вылетает внутри цикла for за исключением

Необработанное исключение в 0x715f39c2 в cam_interface.exe: 0xC0000005: Место чтения нарушения доступа 0x010a0040.

Когда я использую кодек без потерь Хаффмана («H», «F», «Y», «U»), я могу открыть файл AVI. Но так как мои данные состоят только из одного канала, я хочу сохранить только один канал. Используя кодек Хаффмана для монохромного изображения, сохраняются одинаковые значения для всех трех каналов, что я не хотел делать.

Если вы цените любую помощь или идеи о том, как решить эту проблему.

Большое спасибо!

0

Решение

Я нашел обходной путь http://answers.opencv.org где пользователь Pierre столкнулся с той же проблемой и сам создал обходной путь. Я перепишу оригинальный ответ, найденный здесь:
http://answers.opencv.org/question/2133/videocapture-not-working-with-uncompressed-files/

ответ Пьера:

Проблема не решена, но я нашел способ обойти эту проблему, читая изображения отдельно. Сначала необходимо открыть последовательность, чтобы получить код FOURCC и информацию о видеофайле, размере изображений, количестве изображений … Затем, если FOURCC соответствует несжатому AVI, вы закрываете последовательность и повторно открываете ее классическим способом. С функция fopen и прыгать заголовок, а затем использовать функцию Fread, чтобы получить каждое изображение. см. следующий код:

void CMFC_OpencvDlg::OnBnClickedLitSeqAvi()
{
static CString Filter=_T("Video files (*.avi; *.mpg) |*.avi;*.mpg|All Files (*.*)|*.*||");
CFileDialog Load(TRUE, _T("*.bitmap"), NULL, OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST|OFN_HIDEREADONLY,Filter,NULL);
Load.m_ofn.lpstrTitle= _T("Lecture video");
int value = 0 ;
double Height, Width, Nb_images, Code  ;
FILE *Seq_Avi ;
Mat Img ;
if (Load.DoModal() == IDOK)
{
img_path = Load.GetPathName() ;
Nom_de_Sequence = Load.GetPathName() ;
Nom_de_Sequence.Truncate(Nom_de_Sequence.GetLength()-4) ;
VideoCapture Sequence(img_path);
Nb_images = Sequence.get(CV_CAP_PROP_FRAME_COUNT ) ;
Width = Sequence.get(CV_CAP_PROP_FRAME_WIDTH ) ;
Height = Sequence.get(CV_CAP_PROP_FRAME_HEIGHT ) ;
Code = Sequence.get(CV_CAP_PROP_FOURCC ) ;
Nb_Images_Seq = 0 ;
if (Code == CV_FOURCC('Y','8','0','0')|| (Code == 0 ))
{
Sequence.release() ;  // Fermeture du fichier
char *tmp, c ;
string Tag = "movi00d" ;
int i =0 ;
fpos_t pos;
BOOLEAN Fin = TRUE ;
tmp = (char *)malloc(Width*Height) ;
fopen_s(&Seq_Avi,img_path.c_str(),"rb") ;
do  // Gestion de la taille d'entête variable
{
fread(&c,1,1,Seq_Avi) ;
if (c==Tag[i])
{
i++ ;
if (i==7) Fin = FALSE ;
if (i==4)  fgetpos(Seq_Avi,&pos) ;
}
else i = 0 ;
}
while (Fin) ;
fsetpos( Seq_Avi, &pos ) ;
for (i= 0 ; i < Nb_images ;i++)
{
fread(tmp,1,8,Seq_Avi) ;  // Saut du séparateur, "00dc"+taille image
fread(tmp,1,Width*Height,Seq_Avi) ;
Img = Mat(Height, Width, CV_8U, tmp) ;
Seq_image[Nb_Images_Seq] = Img.clone() ;
if (Code == 0 ) flip(Seq_image[Nb_Images_Seq],Seq_image[Nb_Images_Seq],0 ) ;  // Lorsque le code est 0 les images sont stokées bas en haut
imshow("image", Seq_image[Nb_Images_Seq++]);
//      AfxMessageBox(_T("Image suivante"),0,0) ;
}
fclose(Seq_Avi) ;
free(tmp) ;
}
else
{
// Cette partie ne marche pas avec les AVI non compressés !!!!!
while( Sequence.read(src)) //Relecture de out le fichier et traitement associé
{
Seq_image[Nb_Images_Seq++] = src ;
imshow("image", src);
//      AfxMessageBox(_T("Image suivante"),0,0) ;
}
}
}
}
0

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

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector