Seite 3 von 3

Re: Mit PureBasic GPU nutzen

Verfasst: 06.05.2011 17:43
von Stevie63
dige hat geschrieben:Insgesamt habe ich 3 verschiedene Treiber für den Kinect Seonsor gefunden:

- OpenKinect
- PrimeSense
- Codelaboratories

Mit jeden geht was und ne Menge nicht ... es ist eine krux :-\
Hoffentlich kommt wirklich bald das offizielle SDK.
Bin schon auf Dein Bsp. gespannt!
Hi dige,

hier ein Bsp. für das normale Kamerabild (die Tiefenbilder kommen noch)

Code: Alles auswählen


; Import-File created by Lib2PBImport
; Libname: CLNUIDevice.lib
; created: 2011/01/16  10:09

ImportC "CLNUIDevice.lib"
	; ================================================================
	; *Data: .a (1 Byte, 0-255),  *camera: void *
	; Import(bool) GetNUICameraDepthFrameCorrected8(CLNUICamera cam, PBYTE pData, int waitTimeout = 2000);
	GetNUICameraDepthFrameCorrected8.l(*camera, *pData, waitTimeout.l) As "_GetNUICameraDepthFrameCorrected8"
	; ================================================================	
	; *pData: .u (2 Byte, 0-65535)
	; Import(bool) GetNUICameraDepthFrameCorrected12(CLNUICamera cam, PUSHORT pData, int waitTimeout = 2000);
	GetNUICameraDepthFrameCorrected12.l(*camera, *pData, waitTimeout.l) As "_GetNUICameraDepthFrameCorrected12"
	; ================================================================		
	; *pData: .l (32 Bit unsigned)
	; Import(bool) GetNUICameraDepthFrameRGB32(CLNUICamera cam, PDWORD pData, int waitTimeout = 2000);
	GetNUICameraDepthFrameRGB32.l(*camera, *pData, waitTimeout.l) As "_GetNUICameraDepthFrameRGB32"
	; ================================================================			
	; *pData: .u (2 Byte, 0-65535)
	; Import(bool) GetNUICameraDepthFrameRAW(CLNUICamera cam, PUSHORT pData, int waitTimeout = 2000);
	GetNUICameraDepthFrameRAW.l(*camera, *pData, waitTimeout.l) As "_GetNUICameraDepthFrameRAW"
	; ================================================================			
	; *pData: .l (32 Bit unsigned)
	; Import(bool) GetNUICameraColorFrameRGB32(CLNUICamera cam, PDWORD pData, int waitTimeout = 2000);
	GetNUICameraColorFrameRGB32.l(*camera, *pData, waitTimeout.l) As "_GetNUICameraColorFrameRGB32"
	; ================================================================				
	; *Data: .a (1 Byte, 0-255),  *camera: void *
	; Import(bool) GetNUICameraColorFrameRGB24(CLNUICamera cam, PBYTE pData, int waitTimeout = 2000);
	GetNUICameraColorFrameRGB24.l(*camera, *pData, waitTimeout.l) As "_GetNUICameraColorFrameRGB24"
	; ================================================================				
	; Import(bool) GetNUICameraColorFrameRAW(CLNUICamera cam, PBYTE pData, int waitTimeout = 2000);
	GetNUICameraColorFrameRAW.l(*camera, *pData, waitTimeout.l) As "_GetNUICameraColorFrameRAW"
	; ================================================================			
	; Import(bool) StopNUICamera(CLNUICamera cam);
	StopNUICamera.l(*camera) As "_StopNUICamera"
	; ================================================================			
	; Import(bool) StartNUICamera(CLNUICamera cam);
	StartNUICamera.l(*camera) As "_StartNUICamera"
	; ================================================================				
	; Import(bool) DestroyNUICamera(CLNUICamera cam);
	DestroyNUICamera.l(*camera) As "_DestroyNUICamera"
	; ================================================================			
	; Import(CLNUICamera) CreateNUICamera(PCHAR serial);
	CreateNUICamera.l(*serial) As "_CreateNUICamera"
	; ================================================================			
	; Import(bool) SetNUIMotorLED(CLNUIMotor mot, BYTE value);
	SetNUIMotorLED.l(*motor,value.a ) As "_SetNUIMotorLED"
	; ================================================================			
	; Import(bool) SetNUIMotorPosition(CLNUIMotor mot, SHORT position);
	SetNUIMotorPosition.l(*motor,position.w) As "_SetNUIMotorPosition"
	; ================================================================			
	; Import(bool) GetNUIMotorAccelerometer(CLNUIMotor mot, SHORT &x, SHORT &y, SHORT &z);
	GetNUIMotorAccelerometer.l(*motor,*x,*y,*z) As "_GetNUIMotorAccelerometer"
	; ================================================================			
	; Import(bool) DestroyNUIMotor(CLNUIMotor mot);
	DestroyNUIMotor.l(*motor) As "_DestroyNUIMotor"
	; ================================================================			
	; Import(CLNUIMotor) CreateNUIMotor(PCHAR serial);
	CreateNUIMotor.i(*serial) As "_CreateNUIMotor"
	; ================================================================			
	; Import(PCHAR) GetNUIDeviceSerial(int index);
	GetNUIDeviceSerial.i(index.l) As "_GetNUIDeviceSerial"
	; ================================================================			
	; Import(int) GetNUIDeviceCount();
	GetNUIDeviceCount.l() As "_GetNUIDeviceCount"
	; ================================================================			
EndImport








*buffer = AllocateMemory(640*480*3)



Define nr.i = GetNUIDeviceCount()
Define serial.s
serial = PeekS(GetNUIDeviceSerial(0))
Define *camera = CreateNUICamera(@serial)
StartNUICamera(*camera)
Define *motor = CreateNUIMotor(@serial)


SetNUIMotorLED(*motor,1)
Delay(1000)
SetNUIMotorLED(*motor,1)
Delay(1000)
SetNUIMotorLED(*motor,1)
Delay(1000)
SetNUIMotorLED(*motor,1)
Delay(1000)
SetNUIMotorLED(*motor,1)
Delay(1000)





#ScreenWidth  = 640 
#ScreenHeight = 480

If InitSprite() = 0 Or InitKeyboard()=0
  MessageRequester("Error","DirectX 7+ is needed.",0)
EndIf


If OpenScreen(#ScreenWidth, #ScreenHeight, 32, "KinectScreen")

	Repeat
    
    	If StartDrawing(ScreenOutput())
      
			While GetNUICameraColorFrameRGB24(*camera,*buffer,0)  = #False 
				;
			Wend    
			
			For y=0 To 479
				yy=y*3*640
				For x=0 To 639
					v=yy+(x*3)
					v1=v
					v2=v+1
					v3=v+2
					Plot(639-x,y,RGB(PeekA(*buffer+v3),PeekA(*buffer+v2),PeekA(*buffer+v1)))
				Next x
			Next y			
      		StopDrawing()
    	EndIf
    	ExamineKeyboard()
    	FlipBuffers()
  Until KeyboardPushed(#PB_Key_Escape)
  
  DestroyNUIMotor(*motor)
  StopNUICamera(*camera)
  DestroyNUICamera(*camera)
  
Else
  MessageRequester("Error","Can't open the screen !",0)
EndIf

End

Wenn es nicht funktionieren sollte, kann es nur an der Treiberinstallation liegen, d.h. alles runterwerfen außer cl.

cu,

Stevie63


--> added:

Tiefenbild:
(entsprechende Teile austauschen)

Code: Alles auswählen


*buffer32 = AllocateMemory(640*480*4)

	Repeat
    
    	If StartDrawing(ScreenOutput())
      
			
			
			While GetNUICameraDepthFrameRGB32(*camera,*buffer32,0) = #False
				;
			Wend
	
			For y=0 To 479
				yy=y*4*640
				For x=0 To 639
					v=yy+(x*4)
					v1=v
					v2=v+1
					v3=v+2
					v4=v+3
					Plot(x,y,RGBA(PeekA(*buffer32+v3),PeekA(*buffer32+v2),PeekA(*buffer32+v1),PeekA(*buffer32+v4)))
				Next x
			Next y			
      
      		StopDrawing()
    	EndIf
    
    	ExamineKeyboard()
    
    	FlipBuffers()
     
  Until KeyboardPushed(#PB_Key_Escape)

Re: Mit PureBasic GPU nutzen

Verfasst: 06.05.2011 20:43
von dige
@Stevie63: Ja, unter Win7 funzt das frame grabbing prima
und mit Bitblt_() geht das auch richtig fix, aber unter Win XP
geht die Kamera leider nur mit den alten Treibern.

Tja und nun? Ohne das NITE bzw. OpenNI Framework muss
man das User-Tracking komplett selbst machen, oder?

Nach der ersten Euphorie und den gedachten vielen Möglichkeiten
bin ich grad ziemlich geerdet..

Re: Mit PureBasic GPU nutzen

Verfasst: 10.05.2011 13:56
von dige
@Stevie63:

Hab jetzt endlich PCD (palm, click and drag) http://www.kinemote.net/
zum laufen bekommen. Da kann man mit einem virtuellen Handgriff
etwas greifen und auf dem Bildschirm bewegen - macht richtig Spaß.

Basiert allerdings auf dem OpenNI 1.0.0.25 Framework. Mit neueren
Version oder CL läuft es nicht.

Hattest Du schon selber Gestenerkennung hinbekommen?

Ciao Dige