Я сталкиваюсь со следующей проблемой. Поскольку я хочу записывать и воспроизводить данные изображений 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. Но так как мои данные состоят только из одного канала, я хочу сохранить только один канал. Используя кодек Хаффмана для монохромного изображения, сохраняются одинаковые значения для всех трех каналов, что я не хотел делать.
Если вы цените любую помощь или идеи о том, как решить эту проблему.
Большое спасибо!
Я нашел обходной путь 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) ;
}
}
}
}
Других решений пока нет …