Mercurial > hg > nsaunier > traffic-intelligence
view python/cvutils.py @ 190:36968a63efe1
Got the connected_components to finally work using a vecS for the vertex list in the adjacency list.
In this case, the component map is simply a vector of ints (which is the type of UndirectedGraph::vextex_descriptor (=graph_traits<FeatureGraph>::vertex_descriptor) and probably UndirectedGraph::vertices_size_type).
To use listS, I was told on the Boost mailing list:
>> If you truly need listS, you will need to create a vertex index
>> map, fill it in before you create the property map, and pass it to the
>> vector_property_map constructor (and as a type argument to that class).
It may be feasible with a component map like
shared_array_property_map< graph_traits<FeatureGraph>::vertex_descriptor, property_map<FeatureGraph, vertex_index_t>::const_type > components(num_vertices(g), get(vertex_index, g));
| author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
|---|---|
| date | Wed, 07 Dec 2011 18:51:32 -0500 |
| parents | 8e7b354666ec |
| children | e2f31813ade6 |
line wrap: on
line source
#! /usr/bin/env python '''Image/Video utilities''' import Image, ImageDraw # PIL try: import cv2 opencvExists = True except ImportError: print('OpenCV library could not be loaded') opencvExists = False from sys import stdout import utils #import aggdraw # agg on top of PIL (antialiased drawing) #import utils __metaclass__ = type cvRed = (0,0,255) cvGreen = (0,255,0) cvBlue = (255,0,0) cvColors = utils.PlottingPropertyValues([cvRed, cvGreen, cvBlue]) cvKeyNumbers = {'a':1048673, 'n': 1048686, 'y': 1048697} def drawLines(filename, origins, destinations, w = 1, resultFilename='image.png'): '''Draws lines over the image ''' img = Image.open(filename) draw = ImageDraw.Draw(img) #draw = aggdraw.Draw(img) #pen = aggdraw.Pen("red", width) for p1, p2 in zip(origins, destinations): draw.line([p1.x, p1.y, p2.x, p2.y], width = w, fill = (256,0,0)) #draw.line([p1.x, p1.y, p2.x, p2.y], pen) del draw #out = utils.openCheck(resultFilename) img.save(resultFilename) def matlab2PointCorrespondences(filename): '''Loads and converts the point correspondences saved by the matlab camera calibration tool''' from numpy.lib.io import loadtxt, savetxt from numpy.lib.function_base import append points = loadtxt(filename, delimiter=',') savetxt(utils.removeExtension(filename)+'-point-correspondences.txt',append(points[:,:2].T, points[:,3:].T, axis=0)) def loadPointCorrespondences(filename): '''Loads and returns the corresponding points in world (first 2 lines) and image spaces (last 2 lines)''' from numpy.lib.io import loadtxt from numpy import float32 points = loadtxt(filename, dtype=float32) return (points[:2,:].T, points[2:,:].T) # (world points, image points) def computeHomography(srcPoints, dstPoints, method=0, ransacReprojThreshold=0.0): '''Returns the homography matrix mapping from srcPoints to dstPoints (dimension Nx2)''' #cvSrcPoints = arrayToCvMat(srcPoints); #cvDstPoints = arrayToCvMat(dstPoints); #H = cv.CreateMat(3, 3, cv.CV_64FC1) H, mask = cv2.findHomography(srcPoints, dstPoints, method, ransacReprojThreshold) return H def cvMatToArray(cvmat): '''Converts an OpenCV CvMat to numpy array.''' from numpy.core.multiarray import zeros a = zeros((cvmat.rows, cvmat.cols))#array([[0.0]*cvmat.width]*cvmat.height) for i in xrange(cvmat.rows): for j in xrange(cvmat.cols): a[i,j] = cvmat[i,j] return a if opencvExists: def arrayToCvMat(a, t = cv2.cv.CV_64FC1): '''Converts a numpy array to an OpenCV CvMat, with default type CV_64FC1.''' cvmat = cv2.cv.CreateMat(a.shape[0], a.shape[1], t) for i in range(cvmat.rows): for j in range(cvmat.cols): cvmat[i,j] = a[i,j] return cvmat def playVideo(filename): '''Plays the video''' capture = cv2.VideoCapture(filename) if capture.isOpened(): key = -1 while key!= 1048689: # 'q' ret, img = capture.read() if ret: cv2.imshow('frame', img) key = cv2.waitKey(5) def getImagesFromVideo(filename, nImages = 1): '''Returns nImages images from the video sequence''' images = [] capture = cv2.VideoCapture(filename) if capture.isOpened(): ret = False while len(images)<nImages: ret, img = capture.read() while not ret: ret, img = capture.read() if img.size>0: images.append(img) return images def printCvMat(cvmat, out = stdout): '''Prints the cvmat to out''' for i in xrange(cvmat.rows): for j in xrange(cvmat.cols): out.write('{0} '.format(cvmat[i,j])) out.write('\n') def projectArray(homography, points): '''Returns the coordinates of the projected points (format 2xN points) through homography''' from numpy.core._dotblas import dot from numpy.core.multiarray import array from numpy.lib.function_base import append if points.shape[0] != 2: raise Exception('points of dimension {0} {1}'.format(points.shape[0], points.shape[1])) if (homography!=None) and homography.size>0: augmentedPoints = append(points,[[1]*points.shape[1]], 0) prod = dot(homography, augmentedPoints) return prod[0:2]/prod[2] else: return p def project(homography, p): '''Returns the coordinates of the projection of the point p through homography''' from numpy.core.multiarray import array return projectArray(homography, array([[p[0]],p[1]])) def projectTrajectory(homography, trajectory): '''Projects a series of points in the format [[x1, x2, ...], [y1, y2, ...]]''' from numpy.core.multiarray import array return projectArray(homography, array(trajectory)) def invertHomography(homography): 'Returns an inverted homography' from numpy.linalg.linalg import inv invH = inv(homography) invH /= invH[2,2] return invH if opencvExists: def computeTranslation(img1, img2, img1Points, maxTranslation2, minNMatches, windowSize = (5,5), level = 5, criteria = (cv2.TERM_CRITERIA_EPS, 0, 0.01)): '''Computes the translation of img2 with respect to img1 (loaded using OpenCV as numpy arrays) img1Points are used to compute the translation TODO add diagnostic if data is all over the place, and it most likely is not a translation (eg zoom, other non linear distortion)''' from numpy.core.multiarray import array from numpy.lib.function_base import median from numpy.core.fromnumeric import sum nextPoints = array([]) (img2Points, status, track_error) = cv2.calcOpticalFlowPyrLK(img1, img2, img1Points, nextPoints, winSize=windowSize, maxLevel=level, criteria=criteria) # calcOpticalFlowPyrLK(prevImg, nextImg, prevPts[, nextPts[, status[, err[, winSize[, maxLevel[, criteria[, derivLambda[, flags]]]]]]]]) -> nextPts, status, err delta = [] for (k, (p1,p2)) in enumerate(zip(img1Points, img2Points)): if status[k] == 1: dp = p2-p1 d = sum(dp**2) if d < maxTranslation2: delta.append(dp) if len(delta) >= minNMatches: return median(delta, axis=0) else: print(dp) return None
