MFC und OpenCV

Nukleo

Mitglied
Hi,

ich suche einen Weg IplImages der OpenCV-Bildverarbeitungsbibliothek im Fenster einer MFC-Dialog-Applikation darzustellen. Ich arbeite mit VS 2005. Im Dialog befindet sich eine Picture-Control (IDC_IMG) und eine Groupbox (IDC_IMGSTAT). Mit folgendem Code in der OnInitDialog() Methode versuche ich in eines (hier Picture-Control) der beiden Elemente zu zeichen:

Code:
HWND hPic = NULL;
GetDlgItem(IDC_IMG, &hPic);
char* szWindName = (char*)cvGetWindowName(hPic);

IplImage *exclude = cvLoadImage("exclude2.bmp",0);
cvvShowImage(szWindName,exclude);

in allen Fällen wird fehlerfrei compiliert, nur zu sehen ist nichts :confused:
Hoffe ihr habt einen Rat.

Gruß Emu
 
Ok,... dann werde ich mir mal antworten ;)

folgende Funktion in der dlg Klasse gibt Abhilfe:

Code:
void CWinRapDlg::ShowInComp(int IDC_IMG,IplImage* TheImage)
{
	CvvImage shw;
	if (TheImage->nChannels == 3 ) shw.CopyOf(TheImage);
	else shw.CopyOf(TheImage,1);
	CDC *pDC = GetDlgItem(IDC_IMG)->GetDC();
	CRect rect;
	GetDlgItem(IDC_IMG)->GetClientRect(&rect);
	shw.DrawToHDC( pDC->m_hDC, &rect);		
	ReleaseDC(pDC);
}

Übergeben wird die IDC des Steuerelements, indem das Bild dargestellt werden soll und das gewünschte IplImage. Ich verwende als Control jetzt immer Picturecontrols. Diese Funktion muss immer dann aufgerufen werden, wenn das Bild neu gezeichnet werden muss (Fenster wird verschoben; nächstes Bild etc.).

Bis bald
Emu
 
Zuletzt bearbeitet:
Hoffe du verfolgst das Forum noch!
Habe deinen Codeschnippsel soeben verwedet, aber bei mir lassen sich die Controls des MFC-Dialogs nicht mehr bedienen sobald ich die Bilder in die Picture controls geladen habe.
Hattest du ähnliche Probleme?
MfG Flashmaster
 
hey.
du musst threads verwenden, da sonst das passiert was du beschreibst.
hier eine anleitung:


CWinThread* m_pThread; //in der Klasse MyClass
===================================================
Die Haupt-Thread-Funktion:
___________________________________________________
// static UINT thrfunc(LPVOID); Brauch im Dialog nicht statisch zu sein

UINT MyClass::thrfunc(LPVOID pParam)
{
MyClass* p_my_class = (MyClass*) pParam;

p_my_class->MyFunc(); //MyFunc, die sich in der Klasse befindet

return 0;
}
___________________________________________________
Die Start-Thread-Funktion:
Kann genauso gelassen werden.
___________________________________________________

void CdfgdfgerDlg::Thread_Starten(void)
{
m_pThread = AfxBeginThread(thrfunc, this, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
m_pThread->m_bAutoDelete = FALSE;
m_pThread->ResumeThread();
}
___________________________________________________
Die End-Thread-Funktion:
Kann genauso gelassen werden.
___________________________________________________
void CdfgdfgerDlg::Thread_Stoppen(void)
{
if(m_pThread)
{
m_pThread->SuspendThread();
delete m_pThread;
m_pThread = NULL;
}
}
___________________________________________________
Wenn Thread aktiv, kann Info. über den "aktiv Befehl" "vom Hintergrund" geholt werden.
Am besten im Thread-Hauptfunktion den Befehl Thread-stopp() erteilen.
 

Neue Beiträge

Zurück