C++ 有没有办法避免从YUV转换到BGR? 我现在在项目的中间,目的是合并从Web接收的帧(通过OPAL库)。
我编写了一个类合并,它接受所有的框架(来自不同的客户机)。可以使用getFrame方法获得合并的一个 我得到的帧是YUV420p格式的,但是AFAIK,OpenCV的方法支持BGR格式。因此,在向函数输入它们之前,我转换:YUV420p->BGR。接收到的帧也会转换回YUV格式 我是否可以避免这样做(从而加快进程)?以下是我的(伪)代码: getFrame我正在使用cv::resize和copyTo(从当前帧到输出帧) 有没有办法加快这个过程或避免转换?我试着不这样做,但合并后我的帧是黑白的(可能只剩下Y通道)。没有转换到BGR: 以下是addFrame方法,它仅将当前帧添加到具有FrameOwners的向量中,该向量存储在mMerger中: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(从当前帧到输出帧) 有没有办法加快这个过程或避免转换?我试着不这样做,但合并后我的帧是黑白的(可
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();
}