def main(): if len(sys.argv) == 1: print 'Usage: %s [inputfile]' % sys.argv[0] sys.exit(1) # initialize window cv.NamedWindow('video', cv.CV_WINDOW_AUTOSIZE) cv.MoveWindow('video', 10, 10) cv.NamedWindow('threshold', cv.CV_WINDOW_AUTOSIZE) cv.MoveWindow('threshold', 10, 500) cv.NamedWindow('flow', cv.CV_WINDOW_AUTOSIZE) cv.MoveWindow('flow', 500, 10) cv.NamedWindow('edges', cv.CV_WINDOW_AUTOSIZE) cv.MoveWindow('edges', 500, 500) cv.NamedWindow('combined', cv.CV_WINDOW_AUTOSIZE) cv.MoveWindow('combined', 1000, 10) capture = cv.CreateFileCapture(sys.argv[1]) if not capture: print 'Error opening capture'; sys.exit(1) # Load bg image bg = cv.LoadImage('bg.png') # Discard some frames for i in xrange(2300): cv.GrabFrame(capture) frame = cv.QueryFrame(capture) frame_size = cv.GetSize(frame) # vars for playback fps = 25 play = True velx = cv.CreateImage(frame_size, cv.IPL_DEPTH_32F, 1) vely = cv.CreateImage(frame_size, cv.IPL_DEPTH_32F, 1) combined = cv.CreateImage(frame_size, cv.IPL_DEPTH_8U, 1) prev = cv.CreateImage(frame_size, cv.IPL_DEPTH_8U, 1) curr = cv.CreateImage(frame_size, cv.IPL_DEPTH_8U, 1) frame_sub = cv.CreateImage(frame_size, cv.IPL_DEPTH_8U, 3) edges = cv.CreateImage(frame_size, cv.IPL_DEPTH_8U, 1) prev_edges = None storage = cv.CreateMemStorage(0) blob_mask = cv0.cvCreateImage (frame_size, cv.IPL_DEPTH_8U, 1) cv0.cvSet(blob_mask, 1) hough_in = cv.CreateImage(frame_size, cv.IPL_DEPTH_8U, 1) hough_storage = cv.CreateMat( 100, 1, cv.CV_32FC3 ) ''' cv.CvtColor(frame, prev, cv.CV_BGR2GRAY) frame = cv.QueryFrame(capture) cv.CvtColor(frame, curr, cv.CV_BGR2GRAY) # winSize can't have even numbers cv.CalcOpticalFlowLK(prev, curr, (3,3), velx, vely) cv.ShowImage('video', frame) cv.ShowImage('flow', velx) cv.WaitKey(0) ''' while True: if play: frame = cv.QueryFrame(capture) cv.Sub(frame, bg, frame_sub) '''#detect people found = list(cv.HOGDetectMultiScale(frame, storage, win_stride=(8,8), padding=(32,32), scale=1.05, group_threshold=2)) for r in found: (rx, ry), (rw, rh) = r tl = (rx + int(rw*0.1), ry + int(rh*0.07)) br = (rx + int(rw*0.9), ry + int(rh*0.87)) cv.Rectangle(frame, tl, br, (0, 255, 0), 3) ''' #color thresholding hsv = cv.CreateImage(frame_size, cv.IPL_DEPTH_8U, 3); cv.CvtColor(frame, hsv, cv.CV_BGR2HSV) mask = cv.CreateMat(frame_size[1], frame_size[0], cv.CV_8UC1) cv.InRangeS(hsv, (0.06*256, 0.2*256, 0.6*256, 0), (0.16*256, 1.0*256, 1.0*256, 0), mask) cv.ShowImage('threshold', mask) #optical flow method # store previous frame prev, curr = curr, prev # convert next frame to single channel grayscale cv.CvtColor(frame_sub, curr, cv.CV_BGR2GRAY) #cv.CalcOpticalFlowLK(prev, curr, (3,3), velx, vely) #cv.Threshold(velx, velx, 8.0, 0, cv.CV_THRESH_TOZERO) cv.CalcOpticalFlowHS(prev, curr, 1, velx, vely, 0.5, (cv.CV_TERMCRIT_ITER, 10, 0)) cv.Threshold(velx, velx, 0.5, 0, cv.CV_THRESH_TOZERO) cv.Threshold(vely, vely, 0.5, 0, cv.CV_THRESH_TOZERO) cv.Erode(vely, vely, cv.CreateStructuringElementEx(2, 2, 0, 0, cv.CV_SHAPE_ELLIPSE)) cv.Add(vely, velx, vely) cv.ShowImage('flow', vely) #edge detection cv.Canny(curr, edges, 50, 100) cv.Dilate(edges, edges, cv.CreateStructuringElementEx(7, 7, 0, 0, cv.CV_SHAPE_ELLIPSE)) cv.ShowImage('edges', edges) if prev_edges: cv.CalcOpticalFlowHS(prev_edges, edges, 1, velx, vely, 0.5, (cv.CV_TERMCRIT_ITER, 10, 0)) cv.Threshold(velx, velx, 0.5, 0, cv.CV_THRESH_TOZERO) cv.Threshold(vely, vely, 0.5, 0, cv.CV_THRESH_TOZERO) cv.ShowImage('flow', vely) prev_edges = edges cv.Threshold(vely, combined, 0.5, 255, cv.CV_THRESH_BINARY) cv.Min(combined, edges, combined) cv.ShowImage('combined', combined) # blobs myblobs = CBlobResult(edges, blob_mask, 100, False) myblobs.filter_blobs(10, 10000) blob_count = myblobs.GetNumBlobs() for i in range(blob_count): my_enumerated_blob = myblobs.GetBlob(i) # print "%d: Area = %d" % (i, my_enumerated_blob.Area()) my_enumerated_blob.FillBlob(frame, hsv2rgb( i*180.0/blob_count), 0, 0) cv.ShowImage('video', frame) ''' crashes #hough transform on dilated image #http://wiki.elphel.com/index.php? # title=OpenCV_Tennis_balls_recognizing_tutorial&redirect=no cv.Copy(edges, hough_in) cv.Smooth(hough_in, hough_in, cv.CV_GAUSSIAN, 15, 15, 0, 0) cv.HoughCircles(hough_in, hough_storage, cv.CV_HOUGH_GRADIENT, 4, frame_size[1]/10, 100, 40, 0, 0) print hough_storage ''' k = cv.WaitKey(1000/fps) if k == 27: # ESC key break elif k == 'p': # play/pause play = not play
# set the wanted image size from the camera highgui.cvSetCaptureProperty(capture, highgui.CV_CAP_PROP_FRAME_WIDTH, 320) highgui.cvSetCaptureProperty(capture, highgui.CV_CAP_PROP_FRAME_HEIGHT, 240) # capture the 1st frame to get some propertie on it frame = highgui.cvQueryFrame(capture) # get some properties of the frame frame_size = cv.cvGetSize(frame) # create some images useful later my_grayscale = cv.cvCreateImage(frame_size, 8, 1) mask = cv.cvCreateImage(frame_size, 8, 1) cv.cvSet(mask, 1) blob_overlay = False while True: # 1. capture the current image frame = highgui.cvQueryFrame(capture) if frame is None: # no image captured... end the processing break # mirror the captured image cv.cvFlip(frame, None, 1) cv.cvCvtColor(frame, my_grayscale, cv.CV_RGB2GRAY)
def blob_identification(binary_image): from opencv.highgui import cvSaveImage, cvLoadImageM from opencv.cv import cvCreateImage, cvGetSize, cvCreateMat, cvSet, CV_RGB, cvResize from Blob import CBlob from BlobResult import CBlobResult from classification import classification from os import chdir, environ path = environ.get("HOME") frame_size = cvGetSize(binary_image) blo = cvCreateImage(frame_size, 8, 1) resblo = cvCreateMat(240, 320, binary_image.type) mask = cvCreateImage(frame_size, 8, 1) cvSet(mask, 255) myblobs = CBlobResult(binary_image, mask, 0, True) myblobs.filter_blobs(325, 2000) blob_count = myblobs.GetNumBlobs() count = 0 pixr = [] pixrm = [] for i in range(blob_count): value = [] rowval = [] colval = [] cvSet(blo, 0) my_enum_blob = myblobs.GetBlob(i) my_enum_blob.FillBlob(blo, CV_RGB(255, 0, 255), 0, 0) cvSet(resblo, 0) cvResize(blo, resblo, 1) for rowitem in range(resblo.rows): for colitem in range(resblo.cols): if resblo[rowitem, colitem] != 0: rowval.append(rowitem) colval.append(colitem) value.append(resblo[rowitem, colitem]) pixr.append(rowval[0]) pixrm.append(rowval[-1]) rowmin = min(rowval) rowedit = [] for item in rowval: rowedit.append(item - rowmin) coledit = [] colmin = min(colval) for item in colval: coledit.append(int(item) - colmin) rowmax = max(rowedit) colmax = max(colval) - colmin moved = cvCreateMat(rowmax + 10, colmax + 10, blo.type) cvSet(moved, 0) for i in range(len(rowval)): moved[int(rowedit[i]) + 5, int(coledit[i]) + 5] = int(value[i]) chdir(path + "/alpr/latest/blobs") cvSaveImage("pic" + str(count) + ".png", moved) count += 1 avoid = classification(pixr, pixrm) blob_image = cvCreateImage(frame_size, 8, 1) cvSet(blob_image, 0) for i in range(blob_count): if i not in avoid: my_enum_blob = myblobs.GetBlob(i) my_enum_blob.FillBlob(blob_image, CV_RGB(255, 0, 255), 0, 0) cvSaveImage("blob.jpg", blob_image) return
def main(): if len(sys.argv) == 1: print 'Usage: %s [inputfile]' % sys.argv[0] sys.exit(1) # initialize window cv.NamedWindow('video', cv.CV_WINDOW_AUTOSIZE) cv.MoveWindow('video', 10, 10) cv.NamedWindow('threshold', cv.CV_WINDOW_AUTOSIZE) cv.MoveWindow('threshold', 10, 500) cv.NamedWindow('flow', cv.CV_WINDOW_AUTOSIZE) cv.MoveWindow('flow', 500, 10) cv.NamedWindow('edges', cv.CV_WINDOW_AUTOSIZE) cv.MoveWindow('edges', 500, 500) cv.NamedWindow('combined', cv.CV_WINDOW_AUTOSIZE) cv.MoveWindow('combined', 1000, 10) capture = cv.CreateFileCapture(sys.argv[1]) if not capture: print 'Error opening capture' sys.exit(1) # Load bg image bg = cv.LoadImage('bg.png') # Discard some frames for i in xrange(2300): cv.GrabFrame(capture) frame = cv.QueryFrame(capture) frame_size = cv.GetSize(frame) # vars for playback fps = 25 play = True velx = cv.CreateImage(frame_size, cv.IPL_DEPTH_32F, 1) vely = cv.CreateImage(frame_size, cv.IPL_DEPTH_32F, 1) combined = cv.CreateImage(frame_size, cv.IPL_DEPTH_8U, 1) prev = cv.CreateImage(frame_size, cv.IPL_DEPTH_8U, 1) curr = cv.CreateImage(frame_size, cv.IPL_DEPTH_8U, 1) frame_sub = cv.CreateImage(frame_size, cv.IPL_DEPTH_8U, 3) edges = cv.CreateImage(frame_size, cv.IPL_DEPTH_8U, 1) prev_edges = None storage = cv.CreateMemStorage(0) blob_mask = cv0.cvCreateImage(frame_size, cv.IPL_DEPTH_8U, 1) cv0.cvSet(blob_mask, 1) hough_in = cv.CreateImage(frame_size, cv.IPL_DEPTH_8U, 1) hough_storage = cv.CreateMat(100, 1, cv.CV_32FC3) ''' cv.CvtColor(frame, prev, cv.CV_BGR2GRAY) frame = cv.QueryFrame(capture) cv.CvtColor(frame, curr, cv.CV_BGR2GRAY) # winSize can't have even numbers cv.CalcOpticalFlowLK(prev, curr, (3,3), velx, vely) cv.ShowImage('video', frame) cv.ShowImage('flow', velx) cv.WaitKey(0) ''' while True: if play: frame = cv.QueryFrame(capture) cv.Sub(frame, bg, frame_sub) '''#detect people found = list(cv.HOGDetectMultiScale(frame, storage, win_stride=(8,8), padding=(32,32), scale=1.05, group_threshold=2)) for r in found: (rx, ry), (rw, rh) = r tl = (rx + int(rw*0.1), ry + int(rh*0.07)) br = (rx + int(rw*0.9), ry + int(rh*0.87)) cv.Rectangle(frame, tl, br, (0, 255, 0), 3) ''' #color thresholding hsv = cv.CreateImage(frame_size, cv.IPL_DEPTH_8U, 3) cv.CvtColor(frame, hsv, cv.CV_BGR2HSV) mask = cv.CreateMat(frame_size[1], frame_size[0], cv.CV_8UC1) cv.InRangeS(hsv, (0.06 * 256, 0.2 * 256, 0.6 * 256, 0), (0.16 * 256, 1.0 * 256, 1.0 * 256, 0), mask) cv.ShowImage('threshold', mask) #optical flow method # store previous frame prev, curr = curr, prev # convert next frame to single channel grayscale cv.CvtColor(frame_sub, curr, cv.CV_BGR2GRAY) #cv.CalcOpticalFlowLK(prev, curr, (3,3), velx, vely) #cv.Threshold(velx, velx, 8.0, 0, cv.CV_THRESH_TOZERO) cv.CalcOpticalFlowHS(prev, curr, 1, velx, vely, 0.5, (cv.CV_TERMCRIT_ITER, 10, 0)) cv.Threshold(velx, velx, 0.5, 0, cv.CV_THRESH_TOZERO) cv.Threshold(vely, vely, 0.5, 0, cv.CV_THRESH_TOZERO) cv.Erode( vely, vely, cv.CreateStructuringElementEx(2, 2, 0, 0, cv.CV_SHAPE_ELLIPSE)) cv.Add(vely, velx, vely) cv.ShowImage('flow', vely) #edge detection cv.Canny(curr, edges, 50, 100) cv.Dilate( edges, edges, cv.CreateStructuringElementEx(7, 7, 0, 0, cv.CV_SHAPE_ELLIPSE)) cv.ShowImage('edges', edges) if prev_edges: cv.CalcOpticalFlowHS(prev_edges, edges, 1, velx, vely, 0.5, (cv.CV_TERMCRIT_ITER, 10, 0)) cv.Threshold(velx, velx, 0.5, 0, cv.CV_THRESH_TOZERO) cv.Threshold(vely, vely, 0.5, 0, cv.CV_THRESH_TOZERO) cv.ShowImage('flow', vely) prev_edges = edges cv.Threshold(vely, combined, 0.5, 255, cv.CV_THRESH_BINARY) cv.Min(combined, edges, combined) cv.ShowImage('combined', combined) # blobs myblobs = CBlobResult(edges, blob_mask, 100, False) myblobs.filter_blobs(10, 10000) blob_count = myblobs.GetNumBlobs() for i in range(blob_count): my_enumerated_blob = myblobs.GetBlob(i) # print "%d: Area = %d" % (i, my_enumerated_blob.Area()) my_enumerated_blob.FillBlob(frame, hsv2rgb(i * 180.0 / blob_count), 0, 0) cv.ShowImage('video', frame) ''' crashes #hough transform on dilated image #http://wiki.elphel.com/index.php? # title=OpenCV_Tennis_balls_recognizing_tutorial&redirect=no cv.Copy(edges, hough_in) cv.Smooth(hough_in, hough_in, cv.CV_GAUSSIAN, 15, 15, 0, 0) cv.HoughCircles(hough_in, hough_storage, cv.CV_HOUGH_GRADIENT, 4, frame_size[1]/10, 100, 40, 0, 0) print hough_storage ''' k = cv.WaitKey(1000 / fps) if k == 27: # ESC key break elif k == 'p': # play/pause play = not play
def compute_saliency(image): global thresh global scale saliency_scale = int(math.pow(2,scale)); bw_im1 = cv.cvCreateImage(cv.cvGetSize(image), cv.IPL_DEPTH_8U,1) cv.cvCvtColor(image, bw_im1, cv.CV_BGR2GRAY) bw_im = cv.cvCreateImage(cv.cvSize(saliency_scale,saliency_scale), cv.IPL_DEPTH_8U,1) cv.cvResize(bw_im1, bw_im) highgui.cvShowImage("BW", bw_im) realInput = cv.cvCreateImage( cv.cvGetSize(bw_im), cv.IPL_DEPTH_32F, 1); imaginaryInput = cv.cvCreateImage( cv.cvGetSize(bw_im), cv.IPL_DEPTH_32F, 1); complexInput = cv.cvCreateImage( cv.cvGetSize(bw_im), cv.IPL_DEPTH_32F, 2); cv.cvScale(bw_im, realInput, 1.0, 0.0); cv.cvZero(imaginaryInput); cv.cvMerge(realInput, imaginaryInput, None, None, complexInput); dft_M = saliency_scale #cv.cvGetOptimalDFTSize( bw_im.height - 1 ); dft_N = saliency_scale #cv.cvGetOptimalDFTSize( bw_im.width - 1 ); dft_A = cv.cvCreateMat( dft_M, dft_N, cv.CV_32FC2 ); image_Re = cv.cvCreateImage( cv.cvSize(dft_N, dft_M), cv.IPL_DEPTH_32F, 1); image_Im = cv.cvCreateImage( cv.cvSize(dft_N, dft_M), cv.IPL_DEPTH_32F, 1); # copy A to dft_A and pad dft_A with zeros tmp = cv.cvGetSubRect( dft_A, cv.cvRect(0,0, bw_im.width, bw_im.height)); cv.cvCopy( complexInput, tmp, None ); if(dft_A.width > bw_im.width): tmp = cv.cvGetSubRect( dft_A, cv.cvRect(bw_im.width,0, dft_N - bw_im.width, bw_im.height)); cv.cvZero( tmp ); cv.cvDFT( dft_A, dft_A, cv.CV_DXT_FORWARD, complexInput.height ); cv.cvSplit( dft_A, image_Re, image_Im, None, None ); # Compute the phase angle image_Mag = cv.cvCreateImage(cv.cvSize(dft_N, dft_M), cv.IPL_DEPTH_32F, 1); image_Phase = cv.cvCreateImage(cv.cvSize(dft_N, dft_M), cv.IPL_DEPTH_32F, 1); #compute the phase of the spectrum cv.cvCartToPolar(image_Re, image_Im, image_Mag, image_Phase, 0) log_mag = cv.cvCreateImage(cv.cvSize(dft_N, dft_M), cv.IPL_DEPTH_32F, 1); cv.cvLog(image_Mag, log_mag) #Box filter the magnitude, then take the difference image_Mag_Filt = cv.cvCreateImage(cv.cvSize(dft_N, dft_M), cv.IPL_DEPTH_32F, 1); filt = cv.cvCreateMat(3,3, cv.CV_32FC1); cv.cvSet(filt,cv.cvScalarAll(-1.0/9.0)) cv.cvFilter2D(log_mag, image_Mag_Filt, filt, cv.cvPoint(-1,-1)) cv.cvAdd(log_mag, image_Mag_Filt, log_mag, None) cv.cvExp(log_mag, log_mag) cv.cvPolarToCart(log_mag, image_Phase, image_Re, image_Im,0); cv.cvMerge(image_Re, image_Im, None, None, dft_A) cv.cvDFT( dft_A, dft_A, cv.CV_DXT_INVERSE, complexInput.height) tmp = cv.cvGetSubRect( dft_A, cv.cvRect(0,0, bw_im.width, bw_im.height)); cv.cvCopy( tmp, complexInput, None ); cv.cvSplit(complexInput, realInput, imaginaryInput, None, None) min, max = cv.cvMinMaxLoc(realInput); #cv.cvScale(realInput, realInput, 1.0/(max-min), 1.0*(-min)/(max-min)); cv.cvSmooth(realInput, realInput); threshold = thresh/100.0*cv.cvAvg(realInput)[0] cv.cvThreshold(realInput, realInput, threshold, 1.0, cv.CV_THRESH_BINARY) tmp_img = cv.cvCreateImage(cv.cvGetSize(bw_im1),cv.IPL_DEPTH_32F, 1) cv.cvResize(realInput,tmp_img) cv.cvScale(tmp_img, bw_im1, 255,0) return bw_im1
def blob_identification(binary_image): from opencv.highgui import cvSaveImage,cvLoadImageM from opencv.cv import cvCreateImage,cvGetSize,cvCreateMat,cvSet,CV_RGB,cvResize from Blob import CBlob from BlobResult import CBlobResult from classification import classification from os import chdir,environ path = environ.get("HOME") frame_size = cvGetSize (binary_image) blo = cvCreateImage(frame_size, 8, 1) resblo=cvCreateMat(240,320,binary_image.type) mask = cvCreateImage (frame_size, 8, 1) cvSet(mask, 255) myblobs = CBlobResult(binary_image, mask, 0, True) myblobs.filter_blobs(325,2000) blob_count = myblobs.GetNumBlobs() count=0 pixr=[] pixrm=[] for i in range(blob_count): value=[] rowval=[] colval=[] cvSet(blo,0) my_enum_blob = myblobs.GetBlob(i) my_enum_blob.FillBlob(blo,CV_RGB(255,0,255),0,0) cvSet(resblo,0) cvResize(blo,resblo,1) for rowitem in range(resblo.rows): for colitem in range(resblo.cols): if resblo[rowitem,colitem]!=0: rowval.append(rowitem) colval.append(colitem) value.append(resblo[rowitem,colitem]) pixr.append(rowval[0]) pixrm.append(rowval[-1]) rowmin=min(rowval) rowedit=[] for item in rowval: rowedit.append(item-rowmin) coledit=[] colmin=min(colval) for item in colval: coledit.append(int(item)-colmin) rowmax=max(rowedit) colmax=max(colval)-colmin moved=cvCreateMat(rowmax+10,colmax+10,blo.type) cvSet(moved,0) for i in range(len(rowval)): moved[int(rowedit[i])+5,int(coledit[i])+5]=int(value[i]) chdir(path+"/alpr/latest/blobs") cvSaveImage("pic"+ str(count)+".png",moved) count+=1 avoid=classification(pixr,pixrm) blob_image = cvCreateImage(frame_size, 8, 1) cvSet(blob_image,0) for i in range(blob_count): if i not in avoid: my_enum_blob = myblobs.GetBlob(i) my_enum_blob.FillBlob(blob_image,CV_RGB(255,0,255),0,0) cvSaveImage("blob.jpg",blob_image) return
capture = highgui.cvCreateCameraCapture(device) # set the wanted image size from the camera highgui.cvSetCaptureProperty(capture, highgui.CV_CAP_PROP_FRAME_WIDTH, 320) highgui.cvSetCaptureProperty(capture, highgui.CV_CAP_PROP_FRAME_HEIGHT, 240) # capture the 1st frame to get some propertie on it frame = highgui.cvQueryFrame(capture) # get some properties of the frame frame_size = cv.cvGetSize(frame) # create some images useful later my_grayscale = cv.cvCreateImage(frame_size, 8, 1) mask = cv.cvCreateImage(frame_size, 8, 1) cv.cvSet(mask, 1) blob_overlay = False while True: # 1. capture the current image frame = highgui.cvQueryFrame(capture) if frame is None: # no image captured... end the processing break # mirror the captured image cv.cvFlip(frame, None, 1) cv.cvCvtColor(frame, my_grayscale, cv.CV_RGB2GRAY)