OpenCV C ++, videoCapture не может правильно обрабатывать видео (avi) с альфа-каналом

Я все еще изучаю 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 ++ — но это оказывается немного сложнее — учитывая, что документация не так хороша, как я надеялся.

Если у кого-то есть какие-либо предложения / идеи / примеры / исправления — это было бы более чем полезно 🙂

1

Решение

Задача ещё не решена.

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

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

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