Problem mit Bitmap in Gui

  • Hallo,

    bei meinem aktuellen OpenCV-Projekt hab ich ein Problem beim anzeigen einer Bitmap. OpenCV stellt ja eigene GUIs bereit. Nun möchte ich das aber natürlich in einer AutoIt-GUI nutzen bzw. darstellen. Dazu hab ich mal ein wei kleine Testscripte geschrieben. Also ich stelle einmal das Original dar und das Bearbeitete. Aber das Bearbeitete sieht nicht so aus, wie in der OpenCV eignen GUI.

    Mit OpenCV-GUI:

    Spoiler anzeigen
    [autoit]

    #include "OpenCV.au3"
    #include <WinAPIEx.au3>
    #include <GDIPlus.au3>

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Global $tImage1, $tImage2, $tImage3

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    _OpenCV_Startup()
    $tImage1 = _OpenCV_LoadImage(@ScriptDir & "\KoLll.bmp")
    $tImage2 = _OpenCV_CloneImage($tImage1)
    _OpenCV_CvtColor1($tImage2, $CV_BGR2GRAY)
    _OpenCV_Threshold($tImage2, 100, 255, $CV_THRESH_BINARY)

    [/autoit] [autoit][/autoit] [autoit]

    _OpenCV_NamedWindow("Image1")
    _OpenCV_NamedWindow("Image2")
    _OpenCV_MoveWindow("Image1", 50, 50)
    _OpenCV_MoveWindow("Image2", 560, 50)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    For $i = 16 To 8 Step -2
    $tImage3 = _OpenCV_CloneImage($tImage1)
    _OpenCV_Resize($tImage3, $i)
    _OpenCV_ShowImage("Image1", $tImage3)
    _OpenCV_ReleaseImage($tImage3)
    $tImage3 = _OpenCV_CloneImage($tImage2)
    _OpenCV_Resize($tImage3, $i)
    _OpenCV_ShowImage("Image2", $tImage3)
    _OpenCV_ReleaseImage($tImage3)
    Sleep(1000)
    Next

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    _Exit()
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Exit()
    _OpenCV_ReleaseImage($tImage1)
    _OpenCV_ReleaseImage($tImage2)
    _OpenCV_Shutdown()
    Exit
    EndFunc

    [/autoit]

    Das ganze in AutoIt-GUI:

    Spoiler anzeigen
    [autoit]

    #include "OpenCV.au3"
    #include <WinAPIEx.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GDIPlus.au3>

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Opt("GUIOnEventMode", 1)

    [/autoit] [autoit][/autoit] [autoit]

    Global $tImage1, $tImage2, $tImage3, $hGui, $hBitmap, $cPic1, $cPic2

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    _OpenCV_Startup()
    $tImage1 = _OpenCV_LoadImage(@ScriptDir & "\KoLll.bmp")
    $tImage2 = _OpenCV_CloneImage($tImage1)
    _OpenCV_CvtColor1($tImage2, $CV_BGR2GRAY)
    _OpenCV_Threshold($tImage2, 100, 255, $CV_THRESH_BINARY)

    [/autoit] [autoit][/autoit] [autoit]

    $hGui = GUICreate("Test", 900, 400, -1, -1, BitOR($WS_MINIMIZEBOX, $WS_CAPTION, $WS_POPUP, $WS_MAXIMIZEBOX))
    $cPic1 = GUICtrlCreatePic("", 20, 20)
    $cPic2 = GUICtrlCreatePic("", 450, 20)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    For $i = 16 To 8 Step -2
    $tImage3 = _OpenCV_CloneImage($tImage1)
    _OpenCV_Resize($tImage3, $i)
    $hBitmap = _CreateBitmapFromIplImage($tImage3)
    _OpenCV_ReleaseImage($tImage3)
    _WinAPI_DeleteObject(GUICtrlSendMsg($cPic1, 0x0172, 0, $hBitmap))
    $tImage3 = _OpenCV_CloneImage($tImage2)
    _OpenCV_Resize($tImage3, $i)
    $hBitmap = _CreateBitmapFromIplImage($tImage3)
    _OpenCV_ReleaseImage($tImage3)
    _WinAPI_DeleteObject(GUICtrlSendMsg($cPic2, 0x0172, 0, $hBitmap))
    Sleep(1000)
    Next

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(10)
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Exit()
    _OpenCV_ReleaseImage($tImage1)
    _OpenCV_ReleaseImage($tImage2)
    _OpenCV_Shutdown()
    _WinAPI_DeleteObject($hBitmap)
    Exit
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _CreateBitmapFromIplImage($_tIplImage)
    Local $_iWidth = DllStructGetData($_tIplImage, "width")
    Local $_iHeight = DllStructGetData($_tIplImage, "height")
    Local $_iDepth = DllStructGetData($_tIplImage, "depth")
    Local $_iChannels = DllStructGetData($_tIplImage, "nChannels")
    Local $_pData = DllStructGetData($_tIplImage, "imageData")

    [/autoit] [autoit][/autoit] [autoit]

    Local $_hBitmap = _WinAPI_CreateDIB($_iWidth, $_iHeight, $_iDepth * $_iChannels)
    _WinAPI_SetBitmapBits($_hBitmap, $_iWidth * $_iHeight * $_iChannels, $_pData)
    Return $_hBitmap
    EndFunc

    [/autoit]

    Das Bild gibts hier.

    Weiß jemand woran das liegt?

  • So habs herausgefunden. Muss es noch von Grau zu RGBA (bzw. BGRA) konvertieren zum anzeigen.

    Spoiler anzeigen
    [autoit]

    #include "OpenCV.au3"
    #include <WinAPIEx.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GDIPlus.au3>

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Opt("GUIOnEventMode", 1)

    [/autoit] [autoit][/autoit] [autoit]

    Global $tImage1, $tImage2, $tImage3, $hGui, $hBitmap, $cPic1, $cPic2

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    _OpenCV_Startup()
    $tImage1 = _OpenCV_LoadImage(@ScriptDir & "\KoLll.bmp")
    $tImage2 = _OpenCV_CloneImage($tImage1)
    _OpenCV_CvtColor1($tImage2, $CV_BGR2GRAY)
    _OpenCV_Threshold($tImage2, 100, 255, $CV_THRESH_BINARY)
    _OpenCV_CvtColor1($tImage2, $CV_GRAY2RGBA)

    [/autoit] [autoit][/autoit] [autoit]

    $hGui = GUICreate("Test", 900, 400, -1, -1, BitOR($WS_MINIMIZEBOX, $WS_CAPTION, $WS_POPUP, $WS_MAXIMIZEBOX))
    $cPic1 = GUICtrlCreatePic("", 20, 20)
    $cPic2 = GUICtrlCreatePic("", 450, 20)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    For $i = 16 To 8 Step -2
    ConsoleWrite($i & @CRLF)
    $tImage3 = _OpenCV_CloneImage($tImage1)
    _OpenCV_Resize($tImage3, $i)
    $hBitmap = _CreateBitmapFromIplImage($tImage3)
    _OpenCV_ReleaseImage($tImage3)
    _WinAPI_DeleteObject(GUICtrlSendMsg($cPic1, 0x0172, 0, $hBitmap))
    $tImage3 = _OpenCV_CloneImage($tImage2)
    _OpenCV_Resize($tImage3, $i)
    $hBitmap = _CreateBitmapFromIplImage($tImage3)
    _OpenCV_ReleaseImage($tImage3)
    _WinAPI_DeleteObject(GUICtrlSendMsg($cPic2, 0x0172, 0, $hBitmap))
    Sleep(1000)
    Next

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    _Exit()
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Exit()
    _OpenCV_ReleaseImage($tImage1)
    _OpenCV_ReleaseImage($tImage2)
    _OpenCV_Shutdown()
    _WinAPI_DeleteObject($hBitmap)
    Exit
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _CreateBitmapFromIplImage($_tIplImage)
    Local $_iWidth = DllStructGetData($_tIplImage, "width")
    Local $_iHeight = DllStructGetData($_tIplImage, "height")
    Local $_iDepth = DllStructGetData($_tIplImage, "depth")
    Local $_iChannels = DllStructGetData($_tIplImage, "nChannels")
    Local $_pData = DllStructGetData($_tIplImage, "imageData")

    [/autoit] [autoit][/autoit] [autoit]

    Local $_hBitmap = _WinAPI_CreateDIB($_iWidth, $_iHeight, $_iDepth * $_iChannels)
    _WinAPI_SetBitmapBits($_hBitmap, $_iWidth * $_iHeight * $_iChannels, $_pData)
    Return $_hBitmap
    EndFunc

    [/autoit]