opencv - 使用32位ARGB相机缓冲区初始化OpenCV Mat

标签 opencv camera argb

我正在尝试使用包含32位ARGB帧的相机缓冲区初始化Mat。这些是我到目前为止所采取的步骤:

cv::Mat src = cv::Mat(cv::Size(img_height, img_width),CV_8UC4);
memcpy(src.ptr(), (void*) img_buffer,img_height * img_width * 4);

cv::Mat dest= src.clone();

cv::cvtColor(src,dest,COLOR_BGRA2BGR);

这导致段错误。即使将dest初始化为
cv::Mat dest=cv::Mat(src.size(),src.type());

希望对此有所帮助。

更新

所以我想手动解开订单,像这样:
int rgb_temp[4];
for(int y=0; y < (int)img_height; y++) {
    for(int x=0; x < (int)img_width; x++) {
        rgb_temp[0] = (unsigned int)img_buffer[(int)img_stride * y + x + 0]; // A
        rgb_temp[1] = (unsigned int)img_buffer[(int)img_stride * y + x + 1]; // R
        rgb_temp[2] = (unsigned int)img_buffer[(int)img_stride * y + x + 2]; // G
        rgb_temp[3] = (unsigned int)img_buffer[(int)img_stride * y + x + 3]; // B
        src.data[ (y + x)  + 0] = rgb_temp[3]; // B
        src.data[ (y + x)  + 1] = rgb_temp[2]; // G
        src.data[ (y + x)  + 2] = rgb_temp[1]; // R
        src.data[ (y + x)  + 3] = rgb_temp[0]; // A
    }
}

但无济于事。我能够从img_buffer读取ARGB值,但无法写入src.data。这是正确的方法吗?

最佳答案

您可以使用以下构造:

Mat::Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP)

在您的情况下,它将数据映射为OpenCV格式是:
cv::Mat src(img_height, img_width ,CV_8UC4, img_buffer)
cv::Mat dst;
src.copyTo(dst); 

但请注意,第一行不复制数据。

关于opencv - 使用32位ARGB相机缓冲区初始化OpenCV Mat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15023588/

相关文章:

python - Boto3 Kinesis Video GetMedia 和 OpenCV

python - 如何在 2D 向量上使用 reshape() 函数

c++ - 为什么 VideoCapture 在成员函数中不起作用?

java - 确定多摄像机设置中哪个摄像机检测到运动

c++ - 在 OpenCV 中查找椭圆的成本

ios - 在自定义框架中显示相机

android - 谷歌视觉 API 示例 : Get the CameraSource to Focus

c# - 如何改变 XNA 中的色调?

android - PorterDuff.Mode.MULTIPLY - Android 中这种颜色转换的意义