awie10007 -1 Newbie Poster

Scanning from a laser line and usb cam
V Python fill up memory to 1.6G and crash the system
Smaller Scan works fine
is there a better plotting module or a way of getting past V Python
memory block?
The plot must happen in color xyz rgb.

import thread
import sys
import time
import CV
import visual as PLOT

from Geom_3D import *
from Laser_Dots import *
from Ply_Save import *
from PLOT import *

global linelist,linelist_2,PlotNumber,captureR
global image,Red,Picsize,LessData,Stepper

Stepper = 1
Cam = 1
Plot = 1
Liniar,Rotary = 0,1
Picsize = 320,240
Picsize = 640,480

LessData = 20
Picnum = 342
red,green,blue,Value = 1,1,1,1
PlotNumber,PicNum,dot = 1,1,1
CenterLine = 250
linelist = []
linelist_2 = []
Plot_Data = []
Red = red

deviceR = Cam
CamSizeX,CamSizeY = Picsize

LessData = (CamSizeX/(100/LessData))

Win_Name  = 'Get_Laser_Dots'
cv.NamedWindow(Win_Name, 1)
cv.MoveWindow(Win_Name, 450, 10)
CamSizeX,CamSizeY = Picsize
deviceR = Cam
captureR = cv.CreateCameraCapture(deviceR)
cv.SetCaptureProperty (captureR,cv.CV_CAP_PROP_FRAME_HEIGHT,
                       CamSizeY)
cv.SetCaptureProperty (captureR,cv.CV_CAP_PROP_FRAME_WIDTH,
                       CamSizeX)
image = cv.QueryFrame(captureR)
cv.ShowImage(Win_Name, image)
time.sleep(3)
image = cv.QueryFrame(captureR)
cv.ShowImage(Win_Name, image)

Cam = captureR

def on_mouse(event,x, y, flags, param):
    global image,Red,PlotNumber,Value
    if event == cv.CV_EVENT_MOUSEMOVE:
        pass
    if event == cv.CV_EVENT_LBUTTONDOWN:    
        x,y =   int(x) , int(y)
        Pixel = cv.Get2D (image, y, x )
        blue, green, red,N = Pixel
        if cv.CV_EVENT_MBUTTONDOWN:
            PicNum = 1
            dotend = 1
            dot = 1
            PlotNumber = 1
            Red = red
            print Red
            Value = (green + blue)/2
            Value = red = Value
cv.SetMouseCallback('Get_Laser_Dots', on_mouse)


def main():
    thread.start_new_thread(FimdRed,())
def FimdRed():
    global linelist,linelist_2,PlotNumber,image
    global dot
    global image,Red,CenterLine,LessData
    
    while PlotNumber < Picnum:
        
        if Red > 50 and PlotNumber == 1:
            Cam_Stepper()

        if Red > 50:
            image = cv.QueryFrame(captureR)
            PlotNumber = PlotNumber + 1
            linelist = []    
            linelist,image_Return,dot = Laser.FindDot(image,Picnum,linelist,\
                                                      Cam,Red,Value,Picsize)
    
            N,linelist = geo.Get_Geometry(Picnum,linelist,Liniar,\
                                    Rotary,Picsize,CenterLine)
    
            if Plot == 1:
                plot.Plot_3D(linelist,LessData)
            cv.ShowImage(Win_Name, image_Return)
    
            linelist_2 = linelist_2 + linelist
            linelist = []            


if __name__ == "__main__":

    Laser = Get_Laser_Dots(image,Picnum,linelist,Cam,red,Value,Picsize)    
    file = Saving(dot,linelist)    
    geo = Calc_Geometry(Picnum,linelist_2,Liniar,Rotary,Picsize,CenterLine)
    plot = Plot_Visual(linelist,LessData)
    file.formatPLY()    
    main()

    while True:
        if PlotNumber >= Picnum:
            if Red < 50 and PlotNumber == Picnum:
                PlotNumber = 1
            if Red > 50:
                file.Set_PLY_Vertices(dot,linelist_2)
                cv.DestroyWindow('Get_Laser_Dots')
                sys.exit(-1)
                
                
        if(cv.WaitKey(10) != -1):
            break
import cv


class Get_Laser_Dots:
    def __init__(self,image,Picnum,linelist,Cam,Red,Value,Picsize):
        global PlotNumber,xsize,ysize,xxcrop,yycrop,captureR
        global dot

        captureR = Cam
        if not captureR:
            print "Could not initialize capturing..."
            sys.exit(-1)
        
        PlotNumber = 1
        dot = 1

        CamSizeX,CamSizeY = Picsize
        Center = CamSizeX/2
        crop1 = (CamSizeX/5),6
        crop2 = (CamSizeX/2),CamSizeY
        xxcrop,yycrop = crop1
        xsize,ysize = crop2

    def FindDot(self,image,Picnum,linelist,Cam,Red,Value,Picsize):
        global PlotNumber,xsize,ysize,xxcrop,yycrop,captureR
        global on_mouse,dot
        PlotNumber = PlotNumber + 1
        if(image):
            yy = (ysize-yycrop)
            while yy >= 1:
                yy = yy - 1
                ycrop = yy + yycrop
                xx = (xsize-xxcrop)  
                while xx >= 1:
                    xx = xx - 1
                    xcrop = xx + xxcrop
                    x,y =   int(xcrop) , int(ycrop)
                    Pixel = cv.Get2D (image, y, x )
                    blue, green, red,N = Pixel
        
                    if (red>=Red) & (red>=((green+blue)/2)+Value):
                        rr = red
                        x,y =   int(xcrop) , int(ycrop)
                        Pixel = cv.Get2D (image, y, x )
                        blue, green, red,N = Pixel
        
                        while red>=rr :
                            xx = xx - 1
                            xcrop = xx + xxcrop
                            x,y =   int(xcrop) , int(ycrop)
                            Pixel = cv.Get2D (image, y, x )
                            x,y =   int(xcrop) , int(ycrop)
                            Pixel = cv.Get2D (image, y, x )
                            red, green, blue,N = Pixel
                        else:
                            pt1 = int(xcrop) ,int(ycrop)
                            pt2 = int(xcrop+1),int(ycrop+1)
                            cv.Line(image,pt1,pt2, cv.Scalar(0,250,0), 1, 8, 0)
                            if ycrop > 0  and Red > 50:
                                xC,yC =   int(xcrop+8) , int(ycrop)
                                PixelC = cv.Get2D (image, yC, xC )
                                blueC, greenC, redC,N = PixelC
                                linelist.append(xcrop)
                                linelist.append(ycrop)
                                linelist.append(int(redC))
                                linelist.append(int(greenC))
                                linelist.append(int(blueC))
                                linelist.append(int(PlotNumber))
                                dot = dot + 1

                        ycrop = 0
        
        return linelist,image,dot
from math import sin,cos,tan,atan,radians

class Calc_Geometry:
    def __init__(self,Picnum,Datalist,Liniar,Rotary,Picsize,CenterLine):
        global xsize,ysize,xxcrop,yycrop

        CamSizeX,CamSizeY = Picsize
        crop1 = (CamSizeX/5),6
        crop2 = (CamSizeX/2),CamSizeY
        xxcrop,yycrop = crop1
        xsize,ysize = crop2
        
    def Get_Geometry(self,Picnum,Datalist,Liniar,Rotary,Picsize,CenterLine):
        global xsize,ysize,xxcrop,yycrop

        if CenterLine < 10:
            CamSizeX,CamSizeY = Picsize
            CenterLine = CamSizeX/2
        NUMBER = 1
        Geom_list = []
        xyzlist = Datalist 
        for points in range(2, len(xyzlist),6):
            r,ycrop,xcrop,PlotNumber,b,g = xyzlist[points], xyzlist[points-1],\
                                xyzlist[points-2], xyzlist[points-3],\
                                xyzlist[points-4],xyzlist[points-5]

            stepangle = float(360.0 / (Picnum-3))

            if Liniar:
                offset = float(0 * stepangle)
                zc = (((xcrop-CenterLine) * sin(offset * (3.14159/180)))\
                      +PlotNumber)
                yc = -(atan(((500*4.0/5.0)*(3.14159/180)/2.0))*2.0*.210*ycrop)
                xc = -((xcrop-CenterLine) * cos( 0 * (3.14159/180))) 
    
            if Rotary:
                offset = float(PlotNumber * stepangle)
                zc = ((xcrop-CenterLine) * sin(radians(offset))* 2.4)
                xc = -((xcrop-CenterLine) * cos(radians(offset))* 2.4)
                yc = -ycrop
            Geom_list.append(xc)
            Geom_list.append(yc)
            Geom_list.append(zc)
            Geom_list.append(r)
            Geom_list.append(g)
            Geom_list.append(b)
                
            NUMBER = NUMBER + 1
        return NUMBER,Geom_list
import visual as PLOT
from math import *



class Plot_Visual:
    def __init__(self,linelist,LessData):
        global scene,BColor
        scene = PLOT.display(title='GEOMETRY DISPLAY',center = (-2,-250,0),\
                        x=20,y=20,background=([0.0,0.0,0.0]))
        BColor = ([0.60,0.60,0.60])

    def Plot_3D(self,linelist,LessData):
        global dot,scene,BColor

        xyzlist = linelist
        dot = 1
            
        for points in range(2, len(xyzlist),6):
            zc,yc,xc,g,b,r = xyzlist[points], xyzlist[points-1],\
                             xyzlist[points-2], xyzlist[points-3],\
                             xyzlist[points-4],xyzlist[points-5]
        
            x_axis = float(xc) /2
            y_axis = float(yc) /2
            z_axis = float(zc) /2
            fact = (1 / (140 * 1.0))
            r = int(r) * fact
            g = int(g) * fact
            b = int(b) * fact
            scene.background=BColor

            step = ((dot) / LessData)
            step1 = ((dot) - (step*LessData))
            if step1 == 1:
                if r < 80:
                    r = 250
                PLOT.points(pos=(zc, yc, xc), size = 0.0015, color=[(r,g,b)],\
                            center=(x_axis,y_axis,z_axis))
            dot = dot + 1
            drag = 0
        xyzlist = []
import os
import win32file, win32api
import fileinput

class Saving:
    def __init__(self,dot,Datalist):
        print 'start'
    
    def formatPLY(self):
        outPLY = ""
        Value = 1
        plotPLY = "c:/Quick_3D_Scan.ply"
        if os.path.exists(plotPLY):
            os.remove(plotPLY)

        PlyFile = "c:/Quick_3D_Scan.ply"
        outputfile = open(PlyFile,"w")
        str001 = "ply"+"\n" 
        outputfile.write(str001)
        str003 = "format ascii 1.0"+"\n"
        outputfile.write(str003)
        str004 = "comment Awie Spengler generated"+"\n"
        outputfile.write(str004)
        str005 = "element vertex "+"\n"
        outputfile.write(str005)
        str006 = "property float x"+"\n"
        outputfile.write(str006)
        str007 = "property float y"+"\n"
        outputfile.write(str007)
        str008 = "property float z"+"\n"
        outputfile.write(str008)
        str009 = "property uchar red"+"\n"
        outputfile.write(str009)
        str010 = "property uchar green"+"\n"
        outputfile.write(str010)
        str011 = "property uchar blue"+"\n"
        outputfile.write(str011)
        str012 = "property uchar alpha"+"\n"
        outputfile.write(str012)
        str013 = "element face 0"+"\n"
        outputfile.write(str013)
        str014 = "property list uchar int vertex_indices"+"\n"
        outputfile.write(str014)
        str015 = "end_header"+"\n"
        outputfile.write(str015)
        
    def Set_PLY_Vertices(self,Number,Datalist):
        plotdot = "c:/Quick_3D_Scan.ply"
        plotdotBackup = "c:/Quick_3D_Scan.ply"
        temp_dir=win32api.GetFullPathName('c:/')
        outputfile = open(plotdot,"r")
        outputfile.close()
        LNum = str((Number-1))
        A = 'element vertex '+LNum
        for lines in fileinput.FileInput(plotdot,inplace=4):
            lines = lines.replace('element vertex ',A)
            print lines,
            outputfile.close()

        PlyFile = "c:/Quick_3D_Scan.ply"
        outputfile = open(PlyFile,"a")
        xyzlist = Datalist
        outPLY = "" 
        for points in range(2, len(xyzlist),6):
            cz,cy,cx,b,g,r = xyzlist[points], xyzlist[points-1],\
                                xyzlist[points-2], xyzlist[points-3],\
                                xyzlist[points-4], xyzlist[points-5]
            #print cz,cy,cx,b,r,g                    
            outPLY = outPLY + str(cz)
            outPLY = outPLY + " "
            outPLY = outPLY + str(cy)
            outPLY = outPLY + " "
            outPLY = outPLY + str(cx)
            outPLY = outPLY + " "
            outPLY = outPLY + str(r)
            outPLY = outPLY + " "
            outPLY = outPLY + str(g)
            outPLY = outPLY + " "
            outPLY = outPLY + str(b)
            outPLY = outPLY + " "
            outPLY = outPLY + str(255)
            outPLY = outPLY +"\n"
            outputfile.write(outPLY)
            outPLY = ""
        outputfile.close()