首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将无符号字符*图像转换为OpenCV Mat时出现问题

将无符号字符*图像转换为OpenCV Mat时出现问题
EN

Stack Overflow用户
提问于 2013-10-04 09:11:36
回答 2查看 10.6K关注 0票数 4

我有一个问题,解析图像数据从帧采集卡到一个OpenCV Mat格式。我可以从我的EDT帧采集器获取图像数据作为无符号字符指针,并将其传递给新创建的Mat,但我在此过程中丢失了有价值的数据,不确定如何修复它。

我的相机是一台输出12位320x256拜耳图像的红外相机。我相当确信我对EDT的API的使用是正确的。使用EDT的软件"pdvshow",我可以按预期查看图像数据,但当我将从EDT的API返回的帧转换为OpenCV Mat并显示它时,我丢失了大量数据。当我将Mat设置为CV16UC1时,框架接近黑色,当Mat设置为CV8UC1时,框架显示大多数数据,但看起来非常粗糙,一些斑点完全消失。我知道帧采集器将每个12位像素存储在两个字节中,数据是MSB对齐的。GetStride返回0。

代码语言:javascript
运行
复制
unsigned char *pdvImage;
pdvImage = pdv_image(pdv_p); 

cv::Mat freshFrame;
freshFrame = cv::Mat(GetHeight(), GetWidth(), CV_16UC1, pdvImage, GetStride()); //was CV_16UC1 but 8UC1 shows more data

return freshFrame.clone();
EN

回答 2

Stack Overflow用户

发布于 2014-10-17 10:36:26

我已经写了一段代码,绘制一个char*图像,然后将其转换为OpenCV Mat:

代码语言:javascript
运行
复制
const int WIDTH = 800, HEIGHT = 600;

uchar *data = new uchar[WIDTH * HEIGHT * 3];

for (int i = 0; i < WIDTH*HEIGHT*3;i+=3)
{
    if (i < WIDTH*HEIGHT*3/2)
    {
        data[i + 0] = (uchar)0;
        data[i + 1] = (uchar)0;
        data[i + 2] = (uchar)255;
    }
    else
    {
        data[i + 0] = (uchar)255;
        data[i + 1] = (uchar)0;
        data[i + 2] = (uchar)0;
    }
}

cout << "May God be pleased with you, amen!\n";

Mat colorfrm = Mat(HEIGHT, WIDTH, CV_8UC3);
colorfrm.data = data;

while (1)
{
    imshow("Original Image", colorfrm);

    /////////

    int c = cvWaitKey(30);
    if (c == ' ')
    {
        break;
    }
    if (c == 'q' || c == 'Q' || c == 27)
    {
        return 0;
    }
}

我希望这能对你有所帮助!

票数 2
EN

Stack Overflow用户

发布于 2013-10-04 10:15:19

freshFrame创建为CV_16UC1 Mat时,12位数据位于最低有效位。缩放数据将解决结果图像显示太黑的问题。因此,不是

代码语言:javascript
运行
复制
return freshFrame.clone();

你需要

代码语言:javascript
运行
复制
return freshFrame * 16;

您可能还需要检查pdvImage中每个像素的两个字节的字节顺序。

关于CV_8UC1,这将不起作用

代码语言:javascript
运行
复制
freshFrame = cv::Mat(GetHeight(), GetWidth(), CV_8UC1, pdvImage, GetStride()); 

因为pdvImage的前两个字节构成了图像中第一个像素的值,但在freshFrame中却变成了两个独立的像素。但是,如果像上一行那样创建freshFrame,则第一个字节将成为freshFrame中第一个像素的值,第二个字节将成为第二个像素的值,依此类推。显然,这是错误的。如果你真的需要一个CV_8UC1垫,它将是最简单的可能是创建一个CV_16UC1垫,然后转换它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19171582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档