如何在 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 中运行控制台文件? [关闭]