从 dll 调用 opencv Mat 到 windows 形式,图像有问题
Calling an opencv Mat from a dll to windows forms, image is glitchy
我有一个基于 openCv 的 dll,它连接到相机。然后,我将 cv::mat
对象调用到 C# 应用程序中,并将图像显示为图片框对象中的位图。
这行得通,但图像偶尔会 'glitches',每隔几秒就会出现闪烁的线条、静态和爆裂声。
有什么方法可以在显示之前检查位图是否有效?
当我在 dll 中显示图像时,使用 cv::imshow
,它看起来不错。
我的密码是:
在 C++ dll 中:
__declspec(dllexport) uchar* getArucoFrame(void)
{
cv::Mat OriginalImg = returnLeftFrame(); // calls the frame from where the camera thread stores it.
cv::Mat tmp;
cv::cvtColor(OriginalImg, tmp, CV_BGRA2BGR);
//if I cv::imshow the Mat here, it looks good.
return tmp.data;
}
在 C# 端:
//on a button
threadImageShow = new Thread(imageShow);
threadImageShow.Start();
//show image frame in box
private void imageShow()
{
while(true)
{
IntPtr ptr = getArucoFrame();
if (pictureBoxFrame.Image != null)
{
pictureBoxFrame.Image.Dispose();
}
Bitmap a = new Bitmap(640, 360, 3 * 640, PixelFormat.Format24bppRgb, ptr);
pictureBoxFrame.Image = a;
Thread.Sleep(20);
}
}
//dll调用
[DllImport("Vector.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr getArucoFrame();
由于图像在 dll 中看起来不错,而在图片框中出现故障,我在调试时遇到了问题。非常感谢任何帮助。谢谢。
这里的问题是您将指向临时图像 cv::Mat tmp;
的数据的指针传递给 C#,但它在 getArucoFrame(void)
退出时被释放,因此它是悬空指针。它可能有效,但似乎有时会被新数据覆盖。最简单但不是最佳的修复方法是将其声明为静态 static cv::Mat tmp;
,以便在 DLL 卸载时释放它。
我有一个基于 openCv 的 dll,它连接到相机。然后,我将 cv::mat
对象调用到 C# 应用程序中,并将图像显示为图片框对象中的位图。
这行得通,但图像偶尔会 'glitches',每隔几秒就会出现闪烁的线条、静态和爆裂声。
有什么方法可以在显示之前检查位图是否有效?
当我在 dll 中显示图像时,使用 cv::imshow
,它看起来不错。
我的密码是:
在 C++ dll 中:
__declspec(dllexport) uchar* getArucoFrame(void)
{
cv::Mat OriginalImg = returnLeftFrame(); // calls the frame from where the camera thread stores it.
cv::Mat tmp;
cv::cvtColor(OriginalImg, tmp, CV_BGRA2BGR);
//if I cv::imshow the Mat here, it looks good.
return tmp.data;
}
在 C# 端:
//on a button
threadImageShow = new Thread(imageShow);
threadImageShow.Start();
//show image frame in box
private void imageShow()
{
while(true)
{
IntPtr ptr = getArucoFrame();
if (pictureBoxFrame.Image != null)
{
pictureBoxFrame.Image.Dispose();
}
Bitmap a = new Bitmap(640, 360, 3 * 640, PixelFormat.Format24bppRgb, ptr);
pictureBoxFrame.Image = a;
Thread.Sleep(20);
}
}
//dll调用
[DllImport("Vector.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr getArucoFrame();
由于图像在 dll 中看起来不错,而在图片框中出现故障,我在调试时遇到了问题。非常感谢任何帮助。谢谢。
这里的问题是您将指向临时图像 cv::Mat tmp;
的数据的指针传递给 C#,但它在 getArucoFrame(void)
退出时被释放,因此它是悬空指针。它可能有效,但似乎有时会被新数据覆盖。最简单但不是最佳的修复方法是将其声明为静态 static cv::Mat tmp;
,以便在 DLL 卸载时释放它。