Я все еще изучаю openCV, но мне, по крайней мере, удалось найти документацию о том, как разделить видео (.avi) — с альфа-каналом — на кадры, используя openCV 2.4.13, C ++ и videoCapture ().
Ранее я использовал инструмент командной строки, FFMPEG, для разделения и сохранения соответствующего avi в кадры (.png), чтобы я мог проверить, совпадают ли данные RGBA из каждого кадра в моем коде C ++ с сохраненным разделенным кадром RGBA — идея не в том, чтобы записывать кадры на диск, а в том, чтобы работать только с данными RGBA, поэтому я не просто использую FFMPEG в командной строке.
Вот код, который у меня есть, я объясняю свои выводы внизу:
void extract_frames(string& videoFilePath) {
vector<Mat> frameVec;
//open the video file
VideoCapture cap(videoFilePath); // open the video file
if (!cap.isOpened()) // check if we succeeded
CV_Error(CV_StsError, "Can not open Video file");
Mat frame;
for (int frameNum = 0; frameNum < getFrameCountFromAVI(videoFilePath.c_str()); frameNum++)
{
cap >> frame; // get the next frame from video
frameVec.push_back(frame);
}for (int spltF = 0; spltF < frameVec.size(); spltF++) {
// converting frameVec[spltF] to RGBA
// values when trying to read frameVec[spltF]c directly did not match up with image
// not sure why ???? - maybe its the modified pixels / I had the wrong coordinates
uchar* dstRgBA = new uchar[ ((Mat)(frameVec[spltF])).total() * 4];
uchar* camData = new uchar[ ((Mat)(frameVec[spltF])).total() * 4];
Mat continuousRGBA( ((Mat)(frameVec[spltF])).size(), CV_8UC4, camData);
cv::cvtColor( ((Mat)(frameVec[spltF])), continuousRGBA, CV_BGRA2RGBA, 4);for (int i = 0; i < ((Mat)(frameVec[spltF])).rows; i++) {
for (int j = 0; j < ((Mat)(frameVec[spltF])).cols; j++) {
int index = (i*((Mat)(frameVec[spltF])).cols + j) * 4;
// copy while converting to RGBA order
uchar r = continuousRGBA.data[index + 2];
uchar g = continuousRGBA.data[index + 1];
uchar b = continuousRGBA.data[index + 0];
uchar a = continuousRGBA.data[index + 3];
dstRGBA[index + 0] = r;
dstRGBA[index + 1] = g;
dstRGBA[index + 2] = b;
dstRGBA[index + 3] = a;
}
}
.... do stuff with dstRGBA ....
}
+}
При отладке я, кажется, получаю правильные значения RGB (это может быть BGR) в соответствующем пикселе, но кажется, что альфа (A) всегда подходит как 255, я действительно надеюсь, что проблема заключается в моем коде, а не ограничения OpenCV.
В настоящее время я также смотрю на альтернативы, такие как ffmpeg / libavcodec и C ++ — но это оказывается немного сложнее — учитывая, что документация не так хороша, как я надеялся.
Если у кого-то есть какие-либо предложения / идеи / примеры / исправления — это было бы более чем полезно 🙂
Задача ещё не решена.
Других решений пока нет …