Fixed bug with image processing; modified error handling

This commit is contained in:
shimniok@gmail.com 2014-10-27 15:01:34 -06:00
parent de5240bb3b
commit 6f47d67961
2 changed files with 58 additions and 46 deletions

View File

@ -232,17 +232,16 @@ class OMVGtk:
try: try:
# stop running code # stop running code
openmv.stop_script(); openmv.stop_script()
except: # release OpenMV
openmv.release()
except IOError:
pass pass
finally:
# release OpenMV self.connected = False
openmv.release() self._update_title()
self.connect_button.set_sensitive(True)
self.connected = False map(lambda x:x.set_sensitive(False), self.controls)
self._update_title()
self.connect_button.set_sensitive(True)
map(lambda x:x.set_sensitive(False), self.controls)
def connect_clicked(self, widget): def connect_clicked(self, widget):
self.connect() self.connect()
@ -403,7 +402,7 @@ class OMVGtk:
self.statusbar.pop(self.statusbar_ctx) self.statusbar.pop(self.statusbar_ctx)
self.statusbar.push(self.statusbar_ctx, rgb) self.statusbar.push(self.statusbar_ctx, rgb)
def _rgb(rgb): def _rgb(self, rgb):
return struct.pack("BBB", ((rgb & 0xF800) >> 11)*255/31, ((rgb & 0x07E0)>>5)*255/63, (rgb & 0x001F)*255/31) return struct.pack("BBB", ((rgb & 0xF800) >> 11)*255/31, ((rgb & 0x07E0)>>5)*255/63, (rgb & 0x001F)*255/31)
def update_drawing(self): def update_drawing(self):
@ -437,11 +436,11 @@ class OMVGtk:
# JPEG # JPEG
try: try:
buff = Image.frombuffer("RGB", (w, h), buf, "jpeg", "RGB", "").tostring() buff = Image.frombuffer("RGB", (w, h), buf, "jpeg", "RGB", "").tostring()
print('fix JPEG return')
except Exception as e: except Exception as e:
print('JPEG decode error (%s)' % e) print('JPEG decode error (%s)' % e)
buff = None buff = None
else: else:
print len(buff), w, h, w*h*3
if len(buff) != w*h*3: if len(buff) != w*h*3:
print('JPEG buff len != w*h*bpp') print('JPEG buff len != w*h*bpp')
buff = None buff = None
@ -454,8 +453,9 @@ class OMVGtk:
if buff: if buff:
# create pixbuf from np array # create pixbuf from np array
self.pixbuf = gtk.gdk.pixbuf_new_from_data(buff, gtk.gdk.COLORSPACE_RGB, False, 8, w, h, w*h*2) self.pixbuf = gtk.gdk.pixbuf_new_from_data(buff, gtk.gdk.COLORSPACE_RGB, False, 8, w, h, w*3)
self.pixbuf = self.pixbuf.scale_simple(w*SCALE, h*SCALE, gtk.gdk.INTERP_BILINEAR) self.pixbuf = self.pixbuf.scale_simple(w*SCALE, h*SCALE, gtk.gdk.INTERP_BILINEAR)
self.drawingarea.realize() self.drawingarea.realize()
cm = self.drawingarea.window.get_colormap() cm = self.drawingarea.window.get_colormap()
gc = self.drawingarea.window.new_gc(foreground=cm.alloc_color('#FFFFFF', True, False)) gc = self.drawingarea.window.new_gc(foreground=cm.alloc_color('#FFFFFF', True, False))

View File

@ -53,6 +53,7 @@ FORMAT_GRAY = 3
def init(): def init():
global __dev global __dev
# find USB __device # find USB __device
print('OpenMV Cam init()')
try: try:
__dev = usb.core.find(idVendor=__VID, idProduct=__PID) __dev = usb.core.find(idVendor=__VID, idProduct=__PID)
@ -68,9 +69,9 @@ def init():
# set FB debug alt setting # set FB debug alt setting
__dev.set_interface_altsetting(__INTERFACE, __ALTSETTING) __dev.set_interface_altsetting(__INTERFACE, __ALTSETTING)
except USBError as e: except Exception as e:
pass pass
print('USB error while searching for OpenMV Cam: %s' % e.message) print('Error while searching for OpenMV Cam: %s' % e.message)
def find(): def find():
@ -78,11 +79,10 @@ def find():
try: try:
dev = usb.core.find(idVendor=__VID, idProduct=__PID) dev = usb.core.find(idVendor=__VID, idProduct=__PID)
except USBError: except USBError:
print('OpenMV Cam NOT found')
pass pass
found = False
else: else:
if dev: if dev:
print('OpenMV Cam found')
found = True found = True
finally: finally:
return found return found
@ -90,12 +90,13 @@ def find():
def release(): def release():
try: try:
# Release device # Release device resources, interface, etc.
usb.util.dispose_resources(__dev) usb.util.dispose_resources(__dev)
# reattach kernel driver # reattach kernel driver
#__dev.attach_kernel_driver(__INTERFACE) #__dev.attach_kernel_driver(__INTERFACE)
except USBError: except USBError as e:
print('error disposing resources %s' % e)
pass pass
@ -109,45 +110,56 @@ def fb_size():
def fb_lock(): def fb_lock():
try: try:
buf = __dev.ctrl_transfer(0xC1, __USBDBG_FRAME_LOCK, 0, __INTERFACE, 1, __TIMEOUT) buf = __dev.ctrl_transfer(0xC1, __USBDBG_FRAME_LOCK, 0, __INTERFACE, 1, __TIMEOUT)
return struct.unpack("B", buf)[0]
except USBError: except USBError:
pass
return 0 return 0
else:
return struct.unpack("B", buf)[0]
def fb_get(): def fb_get():
if fb_lock() == 0: if fb_lock() == 0:
return None return None
buf = __dev.ctrl_transfer(0xC1, __USBDBG_FRAME_SIZE, 0, __INTERFACE, __FB_HDR_SIZE, __TIMEOUT) try:
size = struct.unpack("III", buf) buf = __dev.ctrl_transfer(0xC1, __USBDBG_FRAME_SIZE, 0, __INTERFACE, __FB_HDR_SIZE, __TIMEOUT)
except USBError as e:
w = size[0] pass
h = size[1] return None
bpp = size[2]
if bpp > 2:
# bpp is actually image size and data is in JPEG format
num_bytes = bpp
fmt = FORMAT_JPEG
else: else:
num_bytes = w * h * bpp size = struct.unpack("III", buf)
if bpp == 1:
fmt = FORMAT_GRAY w = size[0]
elif bpp == 2: h = size[1]
fmt = FORMAT_RGB565 bpp = size[2]
if bpp > 2:
# bpp is actually image size and data is in JPEG format
num_bytes = bpp
fmt = FORMAT_JPEG
else: else:
fmt = None num_bytes = w * h * bpp
w = None if bpp == 1:
h = None fmt = FORMAT_GRAY
elif bpp == 2:
fmt = FORMAT_RGB565
else:
fmt = None
w = None
h = None
if fmt: if fmt:
# read fb data # read fb data
__dev.ctrl_transfer(0xC1, __USBDBG_FRAME_DUMP, num_bytes/4, __INTERFACE, 0, __TIMEOUT) try:
buff = __dev.read(__IN_EP, num_bytes, __INTERFACE, __TIMEOUT) __dev.ctrl_transfer(0xC1, __USBDBG_FRAME_DUMP, num_bytes/4, __INTERFACE, 0, __TIMEOUT)
else: except USBError:
buff = None pass
else:
buff = __dev.read(__IN_EP, num_bytes, __INTERFACE, __TIMEOUT)
else:
buff = None
return fmt, w, h, buff return fmt, w, h, buff
def fb_update(): def fb_update():