none
OpenCV vs. MFC RRS feed

  • Frage

  • Schönen guten Abend,
    Ich möchte einige "IplImages" in "Picture Controls" in MFC darstellen
    Diese Bilder erhalte ich in einer Callback Funktion von einer Kamera, dort werden die Daten global in ein Array geschrieben.
    Das eigentliche Problem ist, dass sich,wenn ich diese Bilder darstelle, all meine Controls nicht mehr bedienen lassen. Die Applikation lässt sich somit auch nicht mehr vernünftig schließen aber die Bilder an sich sind gut dargestellt.

    Diese Funktion stellt die Bilder dar und wird in einer Endlosschleife ausgerufen:

    void CTZG01_GUIDlg::showpics(unsigned short *pic)
    {
            if(pic != NULL)
            {
                    unsigned char row=0,column=0;
                    CBitmap *cbmp;
                    IplImage* simg = cvCreateImage(cvSize(176,144),IPL_DEPTH_16U,1);
                    CvScalar s;
                    int bfcnt=0;
                    for(row=0;row<144;row++)
                    {
                            for(column=0;column<176;column++)
                            {
                                    s.val[0]=pic[bfcnt];
                                    cvSet2D(simg,row,column,s);
                                    bfcnt++;
                            }
                    }
                    cbmp = IplImageToCBitmap(simg);
                    picint.SetBitmap(*cbmp);
                    cvReleaseImage( &simg );
            }
    }

    Und hier wird ein IplImage in ein CBitmap konvertiert:

    CBitmap* IplImageToCBitmap(IplImage* img)
    {
            CDC dc;
            CDC memDC;
            if (!dc.CreateDC(L"DISPLAY", NULL, NULL, NULL))
                    return NULL;
            if (!memDC.CreateCompatibleDC(&dc))
                    return NULL;
            CBitmap* bmp = new CBitmap();
            CBitmap* pOldBitmap;
            bmp->CreateCompatibleBitmap(&dc, img->width, img->height);
            pOldBitmap = memDC.SelectObject(bmp);
            CvvImage cvImage; // Undocumented class
            cvImage.CopyOf(img);
            cvImage.Show(memDC.m_hDC, 0, 0, img->width, img->height, 0, 0);
            cvImage.Destroy();
            memDC.SelectObject(pOldBitmap);
            memDC.DeleteDC();
            dc.DeleteDC();
            return bmp;
    }

     

    Hat jemand vllt eine Idee?

    MfG


    Sonntag, 14. November 2010 16:48

Antworten

  • Das kann so nicht gehen.
    Du musst zwischendrin schon mal die MessageLoop anlaufen lassen, sonst ist doch klar, dass Deine Eingaben nicht bearbeitet werden.

    Entweder verlagerst Du die Darstellung der Bilder in einen Backgroundthread, oder Du steuerst die Bilder über einen Timer an.

    Dir frage ist wie flüssig das ganze geschehen muss.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Sonntag, 14. November 2010 21:21
    Moderator