OpenCV C ++,videoCapture确实没有正确处理带alpha通道的视频(avi)

时间:2017-05-25 14:33:19

标签: c++ opencv video-capture avi rgba

仍在学习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 ++ - 但事实证明这样做有点困难 - 因为文档不如我希望的那么好。

如果任何人有任何建议/想法/示例/修正 - 这将是非常有用的:)

0 个答案:

没有答案