#!/usr/bin/python import traceback import sys, math, os import copy from PIL import Image, ImageDraw import cv2 import numpy as np #import gui_related import wx app = wx.App(False) #print wx.GetDisplaySize() lines=[] filename='noyes2.str' with open(os.path.join(os.path.dirname(__file__), filename), 'rb') as fl: lines=fl.read() bmp=[] print 'A5 at: ', lines.index('\xA5') pixes=[] pix=[] class fib_pattern(object): def write_as_12_bit(self, lines): #fl1=open('out.txt1', 'wb') i=lines.index('\xd7') - 3 firstTime=True size = (4096, 4096) # size of the image to create im = Image.new('L', size) # create the image, 'L' for greyscale self.maxX=0 self.maxY=0 self.minY=4096 self.minX=4096 while True: try: b1 = ord(lines[i]) b2 = ord(lines[i+1]) b3 = ord(lines[i+2]) b4 = ord(lines[i+3]) #something to do with how nybble order gets packed by C compilers nib1 = b2 >> 4 nib2 = b2 & 0xF x = b1 | (nib2<<8) y = (b3<<4) | nib1 dwell = b4 #keep some statistics if x>self.maxX: self.maxX=x if y>self.maxY: self.maxY=y if x<self.minX: self.minX=x if y<self.minY: self.minY=y #write the pixel to the image im.putpixel((x,y), dwell) #advance by 4 bytes i+=4 except IndexError: break im.save('out_test1.png', 'PNG') print "maxX %d, maxY %d" % (self.maxX, self.maxY) print "minX %d, minY %d" % (self.minX, self.minY) print 'num pixels: %d' % (i/4) self.numPixels = (i/4) def write_as_video(self, lines): #fl1=open('out.txt1', 'wb') i=lines.index('\xd7') - 3 print 'i', i firstTime=True size = (4096, 4096) # size of the image to create #im = Image.new('L', size) # create the image, 'L' for greyscale width = (self.maxX - self.minX) + 1 height = (self.maxY - self.minY) + 1 print 'width %d height %d maxX %d minX %d maxY %d minY %d' % (width, height, self.maxX, self.minX, self.maxY, self.minY) #out = cv2.VideoWriter('output.avi',cv2.cv.CV_FOURCC('D', 'I', 'V', 'X'), 20.0, (width,height)) #fourcc = cv2.cv.CV_FOURCC('m', 'p', '4', 'v') # note the lower case #fourcc = cv2.cv.CV_FOURCC('M','J','P','G') #fourcc = cv2.cv.CV_FOURCC('m', 'p', '4', '2') #fourcc = cv2.cv.CV_FOURCC('i','Y','U', 'V')#'D','I','V','X') #CAP_PROP #fourcc = cv2.cv.CV_FOURCC(*'XVID') #print fourcc #out = cv2.VideoWriter() #success = out.open('output.avi',0,30,( width, height),True) m = max(width, height) #out = cv2.VideoWriter("test.avi", cv2.cv.CV_FOURCC('i','Y','u','v'), #'F', 'M', 'P', '4'),'H', '2', '6', '4' # 30, (width, height), False) #import cv syntax CreateVideoWriter #out = cv2.VideoWriter("testmp42.mp4", cv2.cv.CV_FOURCC('M','P','4','2'), #'F', 'M', 'P', '4'),'H', '2', '6', '4' 'D','I','V','3' (works oks) # 90, (width, height), False) #'X','2','6','4' width, height #out = cv2.VideoWriter("testmp4.avi", cv2.cv.CV_FOURCC('D','I','V','3'), 30, (width, height), True) #out = cv2.VideoWriter("test_x264.avi", cv2.cv.CV_FOURCC('X','2','6','4'), 30, (width, height), True) #print 'video opened? %s' % out.isOpened() #print success blank_image = np.zeros((width, height,1), np.uint8) #blank_image = cv2.cv.CreateImage((m, m), 8, 1) #cv_image = cv2.cv.CreateImage((height, width), cv2.IPL_DEPTH_8U,1) cv2.namedWindow('FIB pattern raster sequence')#, cv2.CV_WINDOW_NORMAL|cv2.CV_WINDOW_KEEPRATIO | cv2.CV_GUI_EXPANDED) lastKey=0 #available_screen_size = gui_related.get_available_screen_size() topBarHeight, sideBarWidth, widthAvailable, heightAvailable = wx.ClientDisplayRect() heightAvailable -= topBarHeight # account for the highGui window's title bar if width > widthAvailable: scaleWidth=float(widthAvailable)/width else: scaleWidth = 1 if height > heightAvailable: scaleHeight = float(heightAvailable)/height else: scaleHeight = 1 scale = min(scaleWidth, scaleHeight) scaled_frame_size = (int(width*scale), int(height*scale)) while True: try: b1 = ord(lines[i]) b2 = ord(lines[i+1]) b3 = ord(lines[i+2]) b4 = ord(lines[i+3]) #something to do with how nybble order gets packed by C compilers nib1 = b2 >> 4 nib2 = b2 & 0xF x = b1 | (nib2<<8) y = (b3<<4) | nib1 dwell = b4 #write the pixel to the image #im.putpixel((x,y), dwell) blank_image[(y-self.minY, x-self.minX)] = dwell #cv2.SetReal2D(blank_image, x-self.minX,y-self.minY, dwell) #cv2.cv.WriteFrame(out, #im = cv2.cv.fromarray(blank_image) #cv2.Set2D(cv_image, x, y, dwell) #advance by 4 bytes i+=4 if i%256==0: pass #out.write(cv2.cvtColor(blank_image,cv2.COLOR_GRAY2RGB)) #out.write(blank_image) #cv2.WriteFrame(out, blank_image) #blank_image = cv.CreateImage((width, height), 8, 1) #cv2.SetZero(blank_image) #cv2.imshow('img1',blank_image) #cv2.waitKey(30) # Waits forever for user to press any key #print 'frame' #blank_image = np.zeros((width,height,1), np.uint8) if (i/4%(self.numPixels/100)==1): print 'percent done: %d' % (float(i/4) / self.numPixels *100) if not lastKey == 27: cv2.imshow('FIB pattern raster sequence',cv2.resize(blank_image, scaled_frame_size) ) lastKey = cv2.waitKey(30) # Waits forever for user to press any key print i/4, self.numPixels except IndexError: print "IndexError, last tuple started at byte: %d " % (i - 4) #traceback.print_exc() #out.write(blank_image) #out.write(cv2.cvtColor(blank_image,cv2.COLOR_GRAY2RGB)) #out.write(blank_image) #cv2.waitKey(30) break #im.save('out_test1.png', 'PNG') #out.release() #out=None print "maxX %d, maxY %d" % (self.maxX, self.maxY) print "minX %d, minY %d" % (self.minX, self.minY) print 'num pixels: %d' % (i/4) while cv2.waitKey(0) != 27: cv2.imshow('FIB pattern raster sequence',cv2.resize(blank_image, scaled_frame_size) ) cv2.destroyAllWindows() def write_image(img): w = max([p[0] for p in img]) h = max([p[1] for p in img]) size = (4096, 4096) # size of the image to create im = Image.new('L', size) # create the image draw = ImageDraw.Draw(im) # create a drawing object that is # used to draw on the new image red = (255,0,0) # color of our text table = sum(zip(*img), ()) #draw.point(img) im.putdata(table) """ #fff7fb #ece7f2 #d0d1e6 #a6bddb #74a9cf #3690c0 #0570b0 #034e7b """ del draw # I'm done drawing so I don't need this anymore im.save('out_test1.png', 'PNG') pat = fib_pattern() pat.write_as_12_bit(copy.deepcopy(lines)) pat.write_as_video(lines) #write_as_byte_w_offset(lines) #write_image(pixes) sys.exit(1) pixels = [] pix=[0,0,0] """ for i in range(0, len(lines), 2): #num = int(lines[i].encode('hex'), 16) num = struct.unpack( "H", lines[i:i+2] ) sys.stdout.write(str(num)) pix[i%3]=num if i%3 ==2: print '' pixels.append((pix[0], pix[1], pix[2])) else: sys.stdout.write(', ') #print c, '\t %s' % lines[i] """ fl=open(filename, 'rb') for i in range(0,8): fl.read(1) r = BitReader(fl) i=0 j=0 while True: b1 = fl.read(1) b23 = fl.read(1) b3_latter = fl.read(1) b2 = ord(b23)>>4 & (int('f',16)) if not i==2: x = r.readbits(12) else: x = r.readbits(8) if ( r.read == 0 ): break pix[i%3]=x i+=1 if i==3: pixels.append((pix[0], pix[1], pix[2])) #print '%s, %s, %s' % (pix[0], pix[1], pix[2]) i=0 j+=1 #if j==50: # break h = max([p[0] for p in pixels]) w = max([p[1] for p in pixels]) z = max([p[2] for p in pixels]) print 'maxes of h: %s, w: %s, z: %s' %(h, w, z) import array pixmap = [array.array('i',(0 for i in range(0,h+1))) for i in range(0,h+1)] for pixel in pixels: pixmap[pixel[0]][pixel[1]] = pixel[2] pixlist = [] fl1=open('out.raw', 'wb') for i in range(0, h): for j in range(0, w): fl1.write(struct.pack('i', pixmap[i][j])) fl1.close() fl.close()