用OpenCV从相机数据创建Mat

12

在我的程序中,有一个函数从相机取图像并应将所有数据打包成OpenCV Mat结构。从相机获得宽度、高度和指向图像缓冲区的unsigned char*。我的问题是,如果我有全局Mat变量,如何从这些数据创建Mat。我使用了CV_8UC1作为Mat结构的类型。

Mat image_;

function takePhoto() {
    unsigned int width = getWidthOfPhoto();
    unsinged int height = getHeightOfPhoto();
    unsinged char* dataBuffer = getBufferOfPhoto();
    Mat image(Size(width, height), CV_8UC1, dataBuffer, Mat::AUTO_STEP);

    printf("width: %u\n", image.size().width);
    printf("height: %u\n", image.size().height);

    image_.create(Size(image.size().width, image.size().height), CV_8UC1);
    image_ = image.clone();

    printf("width: %u\n", image_.size().width);
    printf("height: %u\n", image_.size().height);
}

当我测试我的程序时,我得到了image的正确宽度高度,但我的全局Matimage_宽度高度却是0。 我如何正确地将数据放入我的全局Mat变量中?

谢谢。

1个回答

18

很遗憾,无论是clone()还是copyTo()都不能成功复制另一个Mat的width/height值。至少在OpenCV 2.3上是这样的!真是太糟糕了。

然而,通过使函数返回Mat,你可以解决这个问题并简化你的代码。这样你就不需要全局变量:

Mat takePhoto() 
{
    unsigned int width = getWidthOfPhoto();
    unsigned int height = getHeightOfPhoto();
    unsigned char* dataBuffer = getBufferOfPhoto();
    Mat image(Size(width, height), CV_8UC1, dataBuffer, Mat::AUTO_STEP);
    return Mat;
}

int main()
{
    Mat any_img = takePhoto();
    printf("width: %u\n", any_img.size().width);
    printf("height: %u\n", any_img.size().height);
}

嗨Karlphilip,非常感谢您为stackoverflow做出的贡献并帮助我们。我是OpenCV的新手,并且发现您的答案对我正在进行的项目非常有用。我有一个快速的问题,cv :: Mat和cvMat以及cvCreateMat()之间有什么区别? - user261002
3
cv::Mat 是 OpenCV C++ 接口的 Mat 类型。cvMat 是 C 接口的类型。cvCreateMat() 在 C 接口中创建一个 cvMat。请不要在此线程上继续讨论,如果您有问题,请在新线程中提问。再见! - karlphillip

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接