【问题标题】:Displaying webcam feed in cv::Mat format in a picturebox在图片框中以 cv::Mat 格式显示网络摄像头提要
【发布时间】:2012-09-27 07:48:43
【问题描述】:

我正在使用 OpenCV 从网络摄像头获取实时流并在检测到人脸之后。我正在调整它们的大小,以便只显示我的脸。

但问题是我在 C++ Windows 窗体 中执行所有这些操作,我希望它显示在 PictureBox 中,而不是在 OpenCV imshow() 窗口中显示。 p>

我使用的是cv::Mat,所以在图片框中显示时遇到很多问题。

我尝试将其转换为IplImage,但这也不起作用。 另外,我尝试过谷歌,但我找不到有效的解决方案。我已经尝试了 3 天。

这是我的显示代码:

                 face = getFace(frame);
                 cv::imshow("window",face);

其中framefacecv::Mat

【问题讨论】:

  • 要显示到图片框中,您需要将该 IplImage 转换为位图。
  • 你能提供那行代码吗?
  • 我只有用于构建位图的 C# 代码。它采用数据指针 (IplImage->dataOrigin) 和大小来构造它。由于 PictureBox 确实是 C# 的东西,所以我没有在 C++ 中使用它。对于 C++,我宁愿推荐使用 OpenGL 或 DirectX 显示,因为它的速度要快得多。
  • 如果可能,尝试使用 Qt 进行显示...它很简单...您可以使用 Qt 创建的显示窗口而不是 OpenCV 窗口显示 OpenCV 读取的任何图像...特别是您需要的大图像向下滚动 n 右...

标签: c++ winforms opencv picturebox


【解决方案1】:

这是一个 C++ CLR 函数,用于在任何 Windows 窗体控件上绘制 OpenCV 垫子:

void DrawCVImage(System::Windows::Forms::Control^ control, cv::Mat& colorImage)
{
    System::Drawing::Graphics^ graphics = control->CreateGraphics();
    System::IntPtr ptr(colorImage.ptr());
    System::Drawing::Bitmap^ b  = gcnew System::Drawing::Bitmap(colorImage.cols,colorImage.rows,colorImage.step,System::Drawing::Imaging::PixelFormat::Format24bppRgb,ptr);
    System::Drawing::RectangleF rect(0,0,control->Width,control->Height);
    graphics->DrawImage(b,rect);
    delete graphics;
}

此函数只能绘制 8 位 3 通道图像。

尝试将位图的像素格式用于其他图像类型。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-15
  • 2017-07-08
  • 1970-01-01
  • 2015-06-13
  • 2012-08-08
  • 2018-04-26
相关资源
最近更新 更多