OpenCV - 从 BGRA 输出创建 CV_8UC3(3 通道)垫
OpenCV - Create CV_8UC3 (3 channel) Mat from BGRA output
我有一个AVCaptureSession
,它输出BGRA
像素的CMSampleBuffer
。我尝试仅从BGR
创建对象Mat
,以最有效的方式使用数据指针。
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 中的通道数):
// 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
}
}
相关文章:
- 在AVX通道中混洗的最佳方式
- 在Arduino中将PWM通道命名为LEDC是否有特定原因
- 空 grpc 客户端通道
- 如何在进程之间创建双向通道?
- 在 libsndfile 中一次写入一个通道
- 如何在 C++ 中建立进程之间的双向通道?
- 防止控制台在通道字符(在 c++ 中)中输入空格(即空格、制表符和换行符)
- 在RAW图像中提取RGB通道值的库或方法
- 深度缓冲区未填充阴影贴图渲染通道中的数据
- 从 16UC3 到 8UC3 的高性能 OpenCV 矩阵转换
- 如何将具有两个通道的垫子转换为矢量<int><矢量>?
- QWeb通道新客户端获得初始状态?
- Gdiplus位图没有Alpha通道
- Go/C++gRPC客户端通道和存根生命周期
- HBITMAP 能否包含 alpha 通道信息?
- 编写具有 2 个通道的自定义 QIODevice
- 保存的 Gdiplus::位图始终具有 Alpha 通道 (RGBA/ARGB)
- 有没有办法使用 glDrawPixel 渲染单通道灰度图像?
- gRPC C++尝试在无法访问的 IP 上连接通道时阻止客户端
- boost::log 设置"Channel"通道记录器中的属性