如何在 Windows 窗体应用程序中显示 cv::Mat?

Posted

技术标签:

【中文标题】如何在 Windows 窗体应用程序中显示 cv::Mat?【英文标题】:How to display a cv::Mat in a Windows Form application? 【发布时间】:2012-03-23 17:40:33 【问题描述】:

我尝试使用imwrite 成功在 Windows 窗体上显示图像,但它损坏了磁盘,因此我需要更好的方法来执行此操作。

下面是我当前的代码,它将图像临时写入硬盘:

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 

        namedWindow("video",0);
        VideoCapture cap(0);
        flag = true;
        while(flag)
            Mat frame;
            cap >> frame; // get a new frame from camera
            **imwrite("vdo.jpg",frame);**
            this->panel1->BackgroundImage = System::Drawing::Image::FromFile("vdo.jpg");

            waitKey(5);
            delete panel1->BackgroundImage;
            this->panel1->BackgroundImage = nullptr;

        
    

当我尝试使用内存中的 OpenCV Mat 时,我无法让它工作。以下代码 sn-ps 是我迄今为止尝试过的:

this->panel1->BackgroundImage = System::Drawing::Bitmap(frame);

this->panel1->BackgroundImage = gcnew System::Drawing::Bitmap( frame.widht,frame.height,System::Drawing::Imaging::PixelFormat::Undefined, ( System::IntPtr ) frame.imageData);

我想在这段代码中显示frame,而不使用imwrite。我该如何做到这一点?

【问题讨论】:

opencv C++ : How to display webcam capture in windows form application? 的可能重复项 这是c++/cli吗? 【参考方案1】:

避免将图像写入文件然后立即读取回控件绝对是一个好主意。由于硬盘驱动器通常是系统中最慢的存储设备,因此效率非常低。

我不相信您在上面的示例中使用了正确的 Bitmap 构造函数。您可能应该使用this 构造函数定义。此外,告诉Bitmap 对象PixelFormat 未定义可能也无济于事。我假设你有一个彩色相机,它返回一个CV_8UC3 矩阵(即你的PixelFormat == Format24bppRgb)。

试试这样的调用怎么样:

this->panel1->BackgroundImage = gcnew System::Drawing::Bitmap(frame.size().width,
                                                              frame.size().height,
                                                              frame.step,
                                                              PixelFormat::Format24bppRgb,
                                                              (IntPtr)frame.data);

另外,请记住,OpenCV 本身以 BGR 格式存储颜色。因此,您可能需要交换红色和蓝色通道以使数据看起来正确。

希望这能让你开始!

【讨论】:

没问题!如果此答案有助于解决您的问题,请将其标记为答案,以便遇到此问题的其他人知道去哪里查找。谢谢! :) @mevatron +1 好建议。太糟糕了,OP没有回来接受它作为官方答案。您可能也有兴趣回复this one。

以上是关于如何在 Windows 窗体应用程序中显示 cv::Mat?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Windows 窗体应用程序按钮在 Visual Studio 2010 中运行控制台文件? [关闭]

如何在 Windows 窗体应用程序的 rdlc 报告中显示数据库中的图像

如何在Windows窗体应用程序中显示古吉拉特语本地数字?

如何在任务栏顶部全屏显示 Windows 窗体? [复制]

delphi程序如何从任务栏及时还原、显示窗体?

如何使用 c# 从 Windows 窗体向用户显示默认的 Windows 身份验证提示?