Roi*_*lia 1 c++ format opencv pixel
我有一个AVCaptureSession输出CMSampleBuffer像素的东西BGRA。我试图仅使用数据指针以最有效的方式创建Mat对象。BGR
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);
Run Code Online (Sandbox Code Playgroud)
但它似乎不起作用。有什么建议么?
a 中的数据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>
...
Run Code Online (Sandbox Code Playgroud)
并且您无法读取如下数据:
row 0: B G R - B G R - ... B G R - <padding>
row 1: B G R - B G R - ... B G R - <padding>
...
Run Code Online (Sandbox Code Playgroud)
您可以做的是将 BGRA 数据包装在CV_8UC4矩阵中(即在数据上构建矩阵标头):
cv::Mat frameBGRA (height, width, CV_8UC4, buffer);
Run Code Online (Sandbox Code Playgroud)
然后仅复制您需要的字节:
cv::Mat frameBGR;
cv::cvtColor(frameBGRA, frameBGR, cv::COLOR_BGRA2BGR);
Run Code Online (Sandbox Code Playgroud)
另一种解决方案是仅手动将所需的数据复制到 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
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5768 次 |
| 最近记录: |