gpt4 book ai didi

c++ - OpenCV - 从 BGRA 输出创建 CV_8UC3(3 channel )垫

转载 作者:太空宇宙 更新时间:2023-11-03 22:10:50 26 4
gpt4 key购买 nike

我有一个 AVCaptureSession,它输出带有 BGRA 像素的 CMSampleBuffer。我正在尝试仅从 BGR 创建 Mat 对象,以最有效的方式,使用数据 pointers

 CVPixelBufferLockBaseAddress(imageBuffer,0);
void *baseaddress = CVPixelBufferGetBaseAddress(imageBuffer);
CGRect videoRect = CGRectMake(0.0f, 0.0f, CVPixelBufferGetWidth(imageBuffer), CVPixelBufferGetHeight(imageBuffer));
size_t bytesPerRow = (((CVPixelBufferGetBytesPerRow(imageBuffer)
cv::Mat frame(videoRect.size.height, videoRect.size.width,CV_8UC3 , baseaddress, bytesPerRow);

但它似乎不起作用。有什么建议么?

最佳答案

Mat 中的数据必须是连续的(最终在每行末尾有一些额外的填充)。

你的数据是这样的:

row 0: B G R A B G R A ... B G R A <padding>
row 1: B G R A B G R A ... B G R A <padding>
...

而且您不能读取如下数据:

row 0: B G R - B G R - ... B G R - <padding>
row 1: B G R - B G R - ... B G R - <padding>
...

您可以做的是将 BGRA 数据包装在 CV_8UC4 矩阵中(即在您的数据上构建一个矩阵标题):

cv::Mat frameBGRA (height, width, CV_8UC4, buffer);

然后只复制您需要的字节:

cv::Mat frameBGR;
cv::cvtColor(frameBGRA, frameBGR, cv::COLOR_BGRA2BGR);

另一种解决方案是仅将需要的数据手动复制到 BGR 矩阵中(4 是 BGRA 中的 channel 数):

// Create the BGR (3 channel) matrix
cv::Mat3b frameBGR(height, width);


for(int r = 0; r < height; ++r) {
for(int c = 0; c < width; ++c) {

// Copy only BGR
frameBGR(r,c)[0] = buffer((r * c * 4) + (c * 4) + 0); // Blue
frameBGR(r,c)[1] = buffer((r * c * 4) + (c * 4) + 1); // Green
frameBGR(r,c)[2] = buffer((r * c * 4) + (c * 4) + 2); // Red

// Don't consider Alpha channel
// buffer((r * c * 4) + (c * 4) + 3); // Alpha
}
}

关于c++ - OpenCV - 从 BGRA 输出创建 CV_8UC3(3 channel )垫,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37641665/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com