Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有没有办法避免从YUV转换到BGR? 我现在在项目的中间,目的是合并从Web接收的帧(通过OPAL库)。_C++_Opencv_Image Processing_Merge - Fatal编程技术网

C++ 有没有办法避免从YUV转换到BGR? 我现在在项目的中间,目的是合并从Web接收的帧(通过OPAL库)。

C++ 有没有办法避免从YUV转换到BGR? 我现在在项目的中间,目的是合并从Web接收的帧(通过OPAL库)。,c++,opencv,image-processing,merge,C++,Opencv,Image Processing,Merge,我编写了一个类合并,它接受所有的框架(来自不同的客户机)。可以使用getFrame方法获得合并的一个 我得到的帧是YUV420p格式的,但是AFAIK,OpenCV的方法支持BGR格式。因此,在向函数输入它们之前,我转换:YUV420p->BGR。接收到的帧也会转换回YUV格式 我是否可以避免这样做(从而加快进程)?以下是我的(伪)代码: getFrame我正在使用cv::resize和copyTo(从当前帧到输出帧) 有没有办法加快这个过程或避免转换?我试着不这样做,但合并后我的帧是黑白的(可

我编写了一个类合并,它接受所有的框架(来自不同的客户机)。可以使用getFrame方法获得合并的一个

我得到的帧是YUV420p格式的,但是AFAIK,OpenCV的方法支持BGR格式。因此,在向函数输入它们之前,我转换:YUV420p->BGR。接收到的帧也会转换回YUV格式

我是否可以避免这样做(从而加快进程)?以下是我的(伪)代码:

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

有没有办法加快这个过程或避免转换?我试着不这样做,但合并后我的帧是黑白的(可能只剩下Y通道)。没有转换到BGR:

以下是addFrame方法,它仅将当前帧添加到具有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;
}
模板
bool FramesMerger::addOwner(T pOwnerID,cv::Mat pFrame)
{

//我能相信你的问题的答案很大程度上取决于
addFrame()
是如何实现的……我们需要了解它是如何完成它的工作的。合并本身只存储带有它们ID(客户端ID)的帧。有一个带有cv::Mat的向量。Mats被克隆,保存在那里(向量中).PS:我更新了第一条消息。好的,好的,所以我们需要的描述是getFrame()的描述:它背后的魔力是什么?你的代码混合了
tOutputYUV
tMergedFrameYUV
,这是意料之中的吗?我在第一条消息中添加了getFrame代码。使用tOutputYUV,这是我的错误,它应该被称为tMergedFrameYUV,我也编辑了它。它太长了,我在这里添加了它(我还粘贴了resizeFrameBy):
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();
}