我现在正处于项目的中间,其目的是合并从网络收到的框架(通过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:
这是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();
}