У меня есть библиотека на базе openCv, которая подключается к камере. Я тогда называю cv::mat
объект в приложение C # и отображать изображение в виде растрового изображения в объекте picturebox.
Это работает, но изображение иногда «глюки», показывая вспышки линий, статические и всплывающие, каждые несколько секунд.
Есть ли способ проверить правильность растрового изображения перед его отображением?
Когда я показываю изображение в 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.
Других решений пока нет …