gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:44:02 25 4
gpt4 key购买 nike

我尝试使用 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 时,我无法让它工作。以下代码片段是我到目前为止所尝试的:

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。我该如何实现?

最佳答案

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

我不相信您在上面的示例中使用了正确的 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 格式存储颜色。因此,您可能需要交换红色和蓝色 channel 以使数据看起来正确。

希望这能让您入门!

关于c++ - 如何在 Windows 窗体应用程序中显示 cv::Mat?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9580397/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com