仍在学习openCV,但我至少设法找到了如何使用openCV 2.4.13,C ++和使用videoCapture()将视频(.avi)与alpha通道分割成帧的文档。 / p>
我之前使用命令行工具FFMPEG将有问题的avi拆分并保存到帧(.png)中,以便检查我的C ++代码中每帧的RGBA数据是否与保存的相匹配分割帧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)值,但似乎alpha(A)总是上升为255,我真的希望问题是我的代码而不是OpenCV的限制。
我目前也在寻找替代方案,比如ffmpeg / libavcodec和C ++ - 但事实证明这样做有点困难 - 因为文档不如我希望的那么好。
如果任何人有任何建议/想法/示例/修正 - 这将是非常有用的:)