gpt4 book ai didi

c# - 从 dll 调用 opencv Mat 到 Windows 窗体,图像出现故障

转载 作者:行者123 更新时间:2023-11-28 01:44:17 30 4
gpt4 key购买 nike

我有一个基于 openCv 的 dll,它连接到相机。然后,我将 cv::mat 对象调用到 C# 应用程序中,并将图像显示为 picturebox 对象中的位图。这行得通,但图像偶尔会出现“故障”,每隔几秒就会出现线条闪烁、静态和爆裂声。

有没有办法在显示之前检查位图是否有效?当我使用 cv::imshow 在 dll 中显示图像时,它看起来不错。

我的代码是:

在 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 卸载时被释放。

关于c# - 从 dll 调用 opencv Mat 到 Windows 窗体,图像出现故障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45846469/

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