有没有办法避免从YUV转换为BGR?

时间:2014-09-18 09:01:03

标签: c++ opencv image-processing merge

我现在正处于项目的中间,其目的是合并从网络收到的框架(通过OPAL图书馆)。

我写了一个类Merger,它接受所有帧(来自不同的客户端)。可以使用getFrame方法获取合并的一个。

我得到的帧是YUV420p格式,但AFAIK,OpenCV的方法支持BGR格式。所以在用它们喂我的功能之前我转换:YUV420p - > BGR。接收到的帧也被转换回YUV格式。

我可以避免这样做(并因此加快过程吗?这是我的(伪)代码:

unsigned char* receivedFrame()
{
        // tHeader is raw data with header (it was taken via OPAL library) 
        //...
        //...

        Mat tInputYUV = Mat(tHeader->height * 1.5f, tHeader->width, CV_8UC1, OPAL_VIDEO_FRAME_DATA_PTR(tHeader));
        Mat tInputBGR;
        cvtColor(tInputYUV, tInputBGR, CV_YUV420p2BGR);
        mMerger.addFrame(pID, tInputBGR);
        Mat tMergedFrameBGR = mMerger.getFrame();
        Mat tMergedFrameYUV;
        cvtColor(tMergedFrameBGR, tMergedFrameYUV, CV_BGR2YUV_YV12);

        // do stuff with tMergedFrameYUV -> eg. send it to the client
        //...               
        //...
}

getFrame我正在使用cv :: resize和copyTo(从当前帧到输出帧)。

有没有办法加快这个程序或避免转换?我尝试不这样做,但是在合并我的框架之后是黑色&白色(可能只剩下Y通道)。没有转换为BGR:

enter image description here

这是addFrame方法,它只使用FrameOwners将当前帧添加到向量中,而FrameOwners存储在mMerger中:

template<typename T>
bool FramesMerger<T>::addOwner(T pOwnerID, cv::Mat pFrame)
{
    //cout << "FramesMerger<T>::addOwner : received image's size: " << pFrame.cols << ", " << pFrame.rows << endl;
    if(mOwners.empty())
    {
        mMergedFrame = cv::Mat(cv::Size(mMergedFrameWidthPixels, mMergedFrameHeightPixels), pFrame.type(), cv::Scalar(0, 0, 0));
    }
    mOwnersAmountChanged = true;

    return setOwnerFrame(pOwnerID, pFrame);
}

template<typename T>
bool FramesMerger<T>::setOwnerFrame(T pOwnerID, cv::Mat pFrame)
{
    for (int i = 0; i < mOwners.size(); ++i)
    {
        if (mOwners[i].getID() == pOwnerID)
        {
            mOwners[i].setCurrentFrame(pFrame);
            return true;
        }
    }

    mOwners.push_back(FrameOwner<T>(pOwnerID, pFrame));
    return false;
}

设置所有者当前帧的方法:

template<typename T>
void FrameOwner<T>::setCurrentFrame(const cv::Mat& pFrame)
{
    //mLastFrame = mCurrentFrame;
    mLastSize = mCurrentFrame.size();
    mCurrentFrame = pFrame.clone();
    mLastUpdateAt = std::chrono::system_clock::now();
}

0 个答案:

没有答案