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:
# stop running code
openmv.stop_script();
except:
openmv.stop_script()
# release OpenMV
openmv.release()
except IOError:
pass
# release OpenMV
openmv.release()
self.connected = False
self._update_title()
self.connect_button.set_sensitive(True)
map(lambda x:x.set_sensitive(False), self.controls)
finally:
self.connected = False
self._update_title()
self.connect_button.set_sensitive(True)
map(lambda x:x.set_sensitive(False), self.controls)
def connect_clicked(self, widget):
self.connect()
@ -403,7 +402,7 @@ class OMVGtk:
self.statusbar.pop(self.statusbar_ctx)
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)
def update_drawing(self):
@ -437,11 +436,11 @@ class OMVGtk:
# JPEG
try:
buff = Image.frombuffer("RGB", (w, h), buf, "jpeg", "RGB", "").tostring()
print('fix JPEG return')
except Exception as e:
print('JPEG decode error (%s)' % e)
buff = None
else:
print len(buff), w, h, w*h*3
if len(buff) != w*h*3:
print('JPEG buff len != w*h*bpp')
buff = None
@ -454,8 +453,9 @@ class OMVGtk:
if buff:
# 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.drawingarea.realize()
cm = self.drawingarea.window.get_colormap()
gc = self.drawingarea.window.new_gc(foreground=cm.alloc_color('#FFFFFF', True, False))

View File

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