Python-list Digest, Vol 39, Issue 465
Ray Schumacher
subscriber100 at rjs.org
Fri Dec 29 14:35:17 EST 2006
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20061229/d8a0e5b6/attachment.html>
-------------- next part --------------
#Boa:Frame:Frame1
import gc
from time import clock
from numpy import fromstring, add, subtract, divide, where, zeros
import socket
import wx
#import PyDShowCam
import VideoCapture
from StringIO import StringIO
from PIL import Image
def create(parent):
return Frame1(parent)
[wxID_FRAME1, wxID_FRAME1BUTTONCONNECT, wxID_FRAME1BUTTONPROPERTIES,
wxID_FRAME1BUTTONSERVER, wxID_FRAME1BUTTONSETDARK, wxID_FRAME1BUTTONSTOP,
wxID_FRAME1CHECKBOXDIFF, wxID_FRAME1PANEL1, wxID_FRAME1STATICBITMAPVIDEO,
wxID_FRAME1STATUSBAR1, wxID_FRAME1TEXTCTRLADDRESS, wxID_FRAME1TOOLBAR1,
wxID_FRAME1WINDOWVIDEO,
] = [wx.NewId() for _init_ctrls in range(13)]
class Frame1(wx.Frame):
def _init_coll_toolBar1_Tools(self, parent):
# generated method, don't edit
parent.AddControl(control=self.textCtrlAddress)
parent.AddControl(control=self.buttonConnect)
parent.AddControl(control=self.buttonStop)
parent.AddControl(control=self.buttonProperties)
parent.AddControl(control=self.checkBoxDiff)
parent.AddControl(control=self.buttonSetDark)
parent.AddControl(control=self.buttonServer)
parent.Realize()
def _init_coll_statusBar1_Fields(self, parent):
# generated method, don't edit
parent.SetFieldsCount(3)
parent.SetStatusText(number=0, text='"frame:0,\t0fps"')
parent.SetStatusText(number=1, text='')
parent.SetStatusText(number=2, text='')
parent.SetStatusWidths([200, -1, 100])
def _init_ctrls(self, prnt):
# generated method, don't edit
wx.Frame.__init__(self, id=wxID_FRAME1, name='', parent=prnt,
pos=wx.Point(278, 392), size=wx.Size(746, 377),
style=wx.DEFAULT_FRAME_STYLE, title='Confer')
self.SetClientSize(wx.Size(738, 350))
self.statusBar1 = wx.StatusBar(id=wxID_FRAME1STATUSBAR1,
name='statusBar1', parent=self, style=0)
self._init_coll_statusBar1_Fields(self.statusBar1)
self.SetStatusBar(self.statusBar1)
self.toolBar1 = wx.ToolBar(id=wxID_FRAME1TOOLBAR1, name='toolBar1',
parent=self, pos=wx.Point(0, 0), size=wx.Size(767, 27),
style=wx.TB_HORIZONTAL)
self.SetToolBar(self.toolBar1)
self.panel1 = wx.Panel(id=wxID_FRAME1PANEL1, name='panel1', parent=self,
pos=wx.Point(0, 27), size=wx.Size(738, 303),
style=wx.TAB_TRAVERSAL)
self.panel1.SetBackgroundColour(wx.Colour(255, 255, 255))
self.windowVideo = wx.Window(id=wxID_FRAME1WINDOWVIDEO,
name='windowVideo', parent=self.panel1, pos=wx.Point(8, 8),
size=wx.Size(352, 288), style=0)
self.windowVideo.SetBackgroundColour(wx.Colour(0, 0, 0))
self.textCtrlAddress = wx.TextCtrl(id=wxID_FRAME1TEXTCTRLADDRESS,
name='textCtrlAddress', parent=self.toolBar1, pos=wx.Point(0, 0),
size=wx.Size(100, 21), style=0, value='192.168.0.1')
self.textCtrlAddress.SetToolTipString('Enter the remote address here')
self.buttonConnect = wx.Button(id=wxID_FRAME1BUTTONCONNECT,
label='Connect', name='buttonConnect', parent=self.toolBar1,
pos=wx.Point(100, 1), size=wx.Size(60, 19), style=0)
self.buttonConnect.Bind(wx.EVT_BUTTON, self.OnButtonConnectButton,
id=wxID_FRAME1BUTTONCONNECT)
self.buttonStop = wx.Button(id=wxID_FRAME1BUTTONSTOP, label='Stop',
name='buttonStop', parent=self.toolBar1, pos=wx.Point(160, 1),
size=wx.Size(49, 19), style=0)
self.buttonStop.Bind(wx.EVT_BUTTON, self.OnButtonStopButton,
id=wxID_FRAME1BUTTONSTOP)
self.buttonProperties = wx.Button(id=wxID_FRAME1BUTTONPROPERTIES,
label='Cam Properties', name='buttonProperties',
parent=self.toolBar1, pos=wx.Point(209, 1), size=wx.Size(88, 19),
style=0)
self.buttonProperties.Bind(wx.EVT_BUTTON, self.OnButtonPropertiesButton,
id=wxID_FRAME1BUTTONPROPERTIES)
self.staticBitmapVideo = wx.StaticBitmap(bitmap=wx.NullBitmap,
id=wxID_FRAME1STATICBITMAPVIDEO, name='staticBitmapVideo',
parent=self.panel1, pos=wx.Point(374, 8), size=wx.Size(352, 288),
style=0)
self.checkBoxDiff = wx.CheckBox(id=wxID_FRAME1CHECKBOXDIFF,
label='diff frames', name='checkBoxDiff', parent=self.toolBar1,
pos=wx.Point(297, 4), size=wx.Size(70, 13), style=0)
self.checkBoxDiff.SetValue(False)
self.buttonSetDark = wx.Button(id=wxID_FRAME1BUTTONSETDARK,
label='Dark frame', name='buttonSetDark', parent=self.toolBar1,
pos=wx.Point(367, 1), size=wx.Size(75, 19), style=0)
self.buttonSetDark.Bind(wx.EVT_BUTTON, self.OnButtonSetDarkButton,
id=wxID_FRAME1BUTTONSETDARK)
self.buttonServer = wx.Button(id=wxID_FRAME1BUTTONSERVER,
label='Server', name='buttonServer', parent=self.toolBar1,
pos=wx.Point(456, 0), size=wx.Size(75, 23), style=0)
self.buttonServer.Bind(wx.EVT_BUTTON, self.OnButtonServerButton,
id=wxID_FRAME1BUTTONSERVER)
self._init_coll_toolBar1_Tools(self.toolBar1)
def __init__(self, parent):
self._init_ctrls(parent)
self.cam = None
self.buttonStop.Enable(True)
self.darkFrame = None
wx.InitAllImageHandlers()
self.Show()
def OnButtonConnectButton(self, event):
self.cam = VideoCapture.Device(devnum=0, showVideoWindow=0)
buff, width, height = self.cam.dev.getbuffer()
buffArrayLast = fromstring(buff, 'uint8')[-1::-1].copy()
im = wx.EmptyImage(width, height)
self.buttonConnect.Enable(False)
self.buttonStop.Enable(True)
getbuffer = self.cam.dev.getbuffer
darkFrame = self.darkFrame
if darkFrame: darkArray = self.darkArray
im_SetData = im.SetData
im_Mirror = im.Mirror
BitmapFromImage = wx.BitmapFromImage
SetBitmap = self.staticBitmapVideo.SetBitmap
SetStatusText = self.statusBar1.SetStatusText
isDiff = self.checkBoxDiff.GetValue
Yield = wx.Yield
frame = 0
t1 = clock()
while self.cam:
buff, width, height = getbuffer()
buffArray = fromstring(buff, 'uint8')[-1::-1].copy()
if darkFrame: buffArray = where(buffArray>darkArray, subtract(buffArray, darkArray), 0)
if isDiff():
im_SetData(subtract(buffArray, buffArrayLast).tostring())
buffArrayLast = buffArray.copy()
else:
im_SetData(buffArray.tostring())
SetBitmap(BitmapFromImage(im_Mirror()))
Yield()
frame += 1
if frame % 10 == 0:
t2 = clock()-t1
SetStatusText(number=0,
text="frame:%d,\t%.3ffps" % (frame, round(10/(t2), 3)))
t1 = clock()
def OnButtonStopButton(self, event):
self.cam = None
gc.collect
self.buttonConnect.Enable(True)
self.buttonServer.Enable(True)
self.buttonStop.Enable(False)
def OnButtonPropertiesButton(self, event):
if(self.cam != None):
## explicitely remove references to the Capture device
## and run garbage collection
self.cam = None
gc.collect()
self.SetStatusText('Device set to None')
try:
cam = Device(devnum=0, showVideoWindow=1)
## display the dialog-boxes which allow changing the video size
cam.dev.displayCaptureFilterProperties()
cam = None
except:
dlg = wx.MessageDialog(self, 'Cam device does not support displayCaptureFilterProperties()',
'Error', wx.OK | wx.ICON_INFORMATION)
try:
dlg.ShowModal()
finally:
dlg.Destroy()
print '\'Device.displayCaptureFilterProperties\' call not done.'
def OnButtonSetDarkButton(self, event):
self.cam = VideoCapture.Device(devnum=0, showVideoWindow=0)
buff, width, height = self.cam.dev.getbuffer()
darkArray = zeros((width*height*3), 'uint8')
im = wx.EmptyImage(width, height)
getbuffer = self.cam.dev.getbuffer
im_SetData = im.SetData
im_Mirror = im.Mirror
BitmapFromImage = wx.BitmapFromImage
SetBitmap = self.staticBitmapVideo.SetBitmap
SetStatusText = self.statusBar1.SetStatusText
frame = 0
while frame<100:
buff, width, height = getbuffer()
#print fromstring(buff, 'uint8')[-1::-1].copy().shape, darkArray.shape
darkArray = add(fromstring(buff, 'uint8')[-1::-1].copy(), darkArray)
frame += 1
SetStatusText(number=0,
text="frame:%d" % (frame))
im_SetData(darkArray.tostring())
self.bmp = BitmapFromImage(im_Mirror())
SetBitmap(self.bmp)
#imPIL = (Image.frombuffer("RGB", (width, height), darkArray.tostring(), "raw", "RGB", 0, 1) ).transpose(Image.FLIP_LEFT_RIGHT)
self.cam = None
gc.collect
#print darkArray[:21]
#print divide(darkArray, 100).astype('uint8')[21000:21200]
self.darkArray = divide(darkArray, 10).astype('uint8')
#self.bmpFile = StringIO()
#print dir(self.bmpFile)
#im.SaveFile(self.bmpFile, wx.BITMAP_TYPE_JPEG)
#self.bmp.SaveFile('temp.jpg', wx.BITMAP_TYPE_JPEG)
#self.PILFile = StringIO()
#imPIL.save(self.PILFile, "JPEG")
def OnButtonServerButton(self, event):
self.buttonStop.Enable(True)
self.buttonServer.Enable(False)
HOST = '' # Symbolic name meaning the local host
PORT = 8888 # Arbitrary non-privileged port
try: del(self.cam)
except: pass
self.cam = VideoCapture.Device(devnum=0, showVideoWindow=0)
buff, width, height = self.cam.dev.getbuffer()
buffArrayLast = fromstring(buff, 'uint8')[-1::-1].copy()
im = wx.EmptyImage(width, height)
self.buttonConnect.Enable(False)
self.buttonStop.Enable(True)
getbuffer = self.cam.dev.getbuffer
darkFrame = self.darkFrame
if darkFrame: darkArray = self.darkArray
im_SetData = im.SetData
im_Mirror = im.Mirror
BitmapFromImage = wx.BitmapFromImage
SetBitmap = self.staticBitmapVideo.SetBitmap
SetStatusText = self.statusBar1.SetStatusText
isDiff = self.checkBoxDiff.GetValue
Yield = wx.Yield
count = 0
while self.buttonStop.IsEnabled():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print 'Connected by', addr
while self.buttonStop.IsEnabled():
data = conn.recv(1024)
if not data: break
print "Data received:"
if data[:3] == 'GET':
buff, width, height = getbuffer()
imPIL = (Image.frombuffer("RGB", (width, height), buff, "raw", "RGB", 0, 1) ).transpose(Image.FLIP_LEFT_RIGHT)
PILFile = StringIO()
imPIL.save(PILFile, "JPEG")
imString = PILFile.getvalue()
try:
conn.send("HTTP/1.0 200 OK"+"\015\012")
conn.send("Server: RJS_video/0.0.1"+"\015\012")
#conn.send("Content-type: text/html; charset=ISO-8859-1"+"\015\012")
conn.send("Content-type: image/jpeg"+"\015\012")
conn.send("Content-Length: "+str(len(imString))+"\015\012")
conn.send("\015\012")
conn.send(imString)
except:
print 'socket error'
break
count = count + 1
print 'len:', len(data), '\n'#, data
#break
else:
conn.send('err')
print 'err'
print count,
#if count == 5:
#break
print 'Closing connection to', addr
s.close()
Yield()
PILFile.close()
del(self.cam)
def getimage(stream, intoImage=None):
pass
"""
0135 ##Returns a wxImage of the stream specified
0136
0137 # try to read the entire thing in one gulp
0138 data=stream.read()
0139 # save hex version for debugging
0140 # f=open(file+".hex", "w")
0141 # f.write(common.datatohexstring(data))
0142 # f.close()
0143
0144 palettes={}
0145
0146 ### verify format
0147
0148 # header
0149 assert data[0x00:0x04]=='BCI\x00'
0150 # file length
0151 assert readlsb(data[0x04:0x08])<=len(data) # this would be == but the bci tool doesn't truncate the file!
0152 # image offset
0153 imageoffset=readlsb(data[0x08:0x0b])
0154 assert imageoffset<len(data)
0155 # ? (1)
0156 assert readlsb(data[0x0c:0x0e])==1
0157 # width, height
0158 width=readlsb(data[0x0e:0x10])
0159 height=readlsb(data[0x10:0x12])
0160 assert width>0 and height>0
0161 # number of objects/frames/palettes? no idea on order
0162 numitem1=readlsb(data[0x12:0x14])
0163 numitem2=readlsb(data[0x14:0x16])
0164 numitem3=readlsb(data[0x16:0x18])
0165 # print "number of objects/frames/palettes? no idea on order: %d, %d, %d" % (numitem1, numitem2, numitem3)
0166 numpalettes=numitem1 # just a guess
0167 numotherthing=numitem2 # no idea what they are, possibly 'frames' as in the doc
0168 numimages=numitem3 # images, probably 'object' as in the doc
0169 # ? (0)
0170 assert readlsb(data[0x18:0x1a])==0
0171 # palette depth?
0172 bpp=readlsb(data[0x1a:0x1c])
0173 # read the palettes
0174 offset=0x1c
0175 for _ in range(numpalettes):
0176 id=readlsb(data[offset:offset+2])
0177 # print "palette id",id
0178 offset+=2
0179 numentries=readlsb(data[offset:offset+2])
0180 # print "contains",numentries,"entries"
0181 offset+=2
0182 # f=open(file+".palette."+`id`+".hex", "w")
0183 # f.write(common.datatohexstring(data[offset:offset+numentries*4]))
0184 # f.close()
0185 pal=BCIPalette(data[offset:offset+numentries*4])
0186 offset+=numentries*4
0187 palettes[id]=pal
0188
0189
0190 # some other type of object, possibly frames as in the doc
0191 for _ in range(numotherthing):
0192 # we just ignore the contents for the moment
0193 # print common.datatohexstring(data[offset:offset+0x14])
0194 offset+=0x14
0195
0196 # images
0197 for _ in range(numimages):
0198 szdata=readlsb(data[offset:offset+4])
0199 width=readlsb(data[offset+4:offset+6])
0200 height=readlsb(data[offset+6:offset+8])
0201 id1=readlsb(data[offset+8:offset+0xa]) # image id?
0202 id2=readlsb(data[offset+0xa:offset+0xc]) # palette id?
0203 offset+=0xc
0204 buf=data[offset:offset+szdata]
0205 res=zlib.decompress(buf)
0206 # f=open(file+".image."+`id1`+".hex", "w")
0207 # f.write(common.datatohexstring(res))
0208 # f.close()
0209
0210 img=MyImage(width, height, res, palettes[id2])
0211
0212 return img.toImage(intoImage)
"""
-------------- next part --------------
#!/usr/bin/env python
#Boa:App:BoaApp
import wx
import Frame1
modules ={'Frame1': [1, 'Main frame of Application', 'Frame1.py']}
class BoaApp(wx.App):
def OnInit(self):
wx.InitAllImageHandlers()
self.main = Frame1.create(None)
self.main.Show()
self.SetTopWindow(self.main)
return True
def main():
#import psyco
#psyco.full()
application = BoaApp(0)
application.MainLoop()
if __name__ == '__main__':
main()
More information about the Python-list
mailing list