Вызов opencv Mat из dll в формы Windows, изображение глючит

У меня есть DLL на основе openCv, которая подключается к камере. Затем я вызываю объект cv::mat в приложение C# и отображаю изображение как растровое изображение в объекте изображения. Это работает, но изображение иногда «глючит», показывая вспышки линий, статические и всплывающие окна каждые несколько секунд.

Есть ли способ проверить, действительно ли растровое изображение, прежде чем отображать его? Когда я показываю изображение в dll, используя cv::imshow, оно выглядит нормально.

Код у меня есть:

в С++ 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;
}

на стороне С#:

//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 и глючит в окне изображения, у меня возникают проблемы с его отладкой. Любая помощь очень ценится. Спасибо.


person anti    schedule 23.08.2017    source источник


Ответы (1)


У вас есть проблема в том, что вы передаете указатель на данные временного изображения cv::Mat tmp; в C#, но он освобождается при выходе из getArucoFrame(void), поэтому это висячий указатель. Это может работать, но кажется, что иногда он перезаписывается новыми данными. Самым простым, но не самым оптимальным решением было бы объявить его статическим static cv::Mat tmp;, чтобы он освобождался при выгрузке DLL.

person R2RT    schedule 23.08.2017
comment
Спасибо! Рву на себе волосы из-за этого уже несколько дней. ОЧЕНЬ ценю вашу помощь. - person anti; 23.08.2017