def image_from_archive(archive, name): """ Load image PGM file from tar archive. Used for tarfile loading and unit test. """ member = archive.getmember(name) filedata = archive.extractfile(member).read() imagefiledata = cv.CreateMat(1, len(filedata), cv.CV_8UC1) cv.SetData(imagefiledata, filedata, len(filedata)) return cv.DecodeImageM(imagefiledata)
def get_sample(self, filename, iscolor=cv.CV_LOAD_IMAGE_COLOR): if not filename in self.image_cache: filedata = None if OpenCVTests.repoPath is not None: candidate = OpenCVTests.repoPath + '/' + filename if os.path.isfile(candidate): with open(candidate, 'rb') as f: filedata = f.read() if filedata is None: filedata = urllib.urlopen(OpenCVTests.repoUrl + '/' + filename).read() imagefiledata = cv.CreateMatHeader(1, len(filedata), cv.CV_8UC1) cv.SetData(imagefiledata, filedata, len(filedata)) self.image_cache[filename] = cv.DecodeImageM( imagefiledata, iscolor) return self.image_cache[filename]
if __name__ == "__main__": cv.NamedWindow("win") if len(sys.argv) > 1: filename = sys.argv[1] im = cv.LoadImage(filename, cv.CV_LOAD_IMAGE_GRAYSCALE) im3 = cv.LoadImage(filename, cv.CV_LOAD_IMAGE_COLOR) else: try: # try opening local copy of image fileName = '../cpp/left01.jpg' im = cv.LoadImageM(fileName, False) im3 = cv.LoadImageM(fileName, True) except: # if local copy cannot be opened, try downloading it url = 'https://raw.github.com/opencv/opencv/master/samples/cpp/left01.jpg' filedata = urllib2.urlopen(url).read() imagefiledata = cv.CreateMatHeader(1, len(filedata), cv.CV_8UC1) cv.SetData(imagefiledata, filedata, len(filedata)) im = cv.DecodeImageM(imagefiledata, cv.CV_LOAD_IMAGE_GRAYSCALE) im3 = cv.DecodeImageM(imagefiledata, cv.CV_LOAD_IMAGE_COLOR) chessboard_dim = (9, 6) found_all, corners = cv.FindChessboardCorners(im, chessboard_dim) print found_all, len(corners) cv.DrawChessboardCorners(im3, chessboard_dim, corners, found_all) cv.ShowImage("win", im3) cv.WaitKey() cv.DestroyAllWindows()
cv.ShowImage("image", self.dst_image) cv.CalcArrHist([self.dst_image], self.hist) (min_value, max_value, _, _) = cv.GetMinMaxHistValue(self.hist) cv.Scale(self.hist.bins, self.hist.bins, float(self.hist_image.height) / max_value, 0) cv.Set(self.hist_image, cv.ScalarAll(255)) bin_w = round(float(self.hist_image.width) / hist_size) for i in range(hist_size): cv.Rectangle(self.hist_image, (int(i * bin_w), self.hist_image.height), (int((i + 1) * bin_w), self.hist_image.height - cv.Round(self.hist.bins[i])), cv.ScalarAll(0), -1, 8, 0) cv.ShowImage("histogram", self.hist_image) if __name__ == "__main__": # Load the source image. if len(sys.argv) > 1: src_image = cv.GetMat(cv.LoadImage(sys.argv[1], 0)) else: url = 'https://code.ros.org/svn/opencv/trunk/opencv/samples/c/baboon.jpg' filedata = urllib2.urlopen(url).read() imagefiledata = cv.CreateMatHeader(1, len(filedata), cv.CV_8UC1) cv.SetData(imagefiledata, filedata, len(filedata)) src_image = cv.DecodeImageM(imagefiledata, 0) dh = DemHist(src_image) cv.WaitKey(0)
def extract_features(filename, is_url=False): '''Extracts features to be used in text image classifier. :param filename: input image :param is_url: is input image a url or a file path on disk :return: tuple of features: (average_slope, median_slope, average_tilt, median_tilt, median_differences, average_differences, nr_straight_lines) Most relevant ones are average_slope, average_differences and nr_straight_lines. ''' if is_url: filedata = urllib2.urlopen(filename).read() imagefiledata = cv.CreateMatHeader(1, len(filedata), cv.CV_8UC1) cv.SetData(imagefiledata, filedata, len(filedata)) src = cv.DecodeImageM(imagefiledata, cv.CV_LOAD_IMAGE_GRAYSCALE) else: src = cv.LoadImage(filename, cv.CV_LOAD_IMAGE_GRAYSCALE) # normalize size normalized_size = 400 # smaller dimension will be 400, longer dimension will be proportional orig_size = cv.GetSize(src) max_dim_idx = max(enumerate(orig_size), key=lambda l: l[1])[0] min_dim_idx = [idx for idx in [0, 1] if idx != max_dim_idx][0] new_size = [0, 0] new_size[min_dim_idx] = normalized_size new_size[max_dim_idx] = int( float(orig_size[max_dim_idx]) / orig_size[min_dim_idx] * normalized_size) dst = cv.CreateImage(new_size, 8, 1) cv.Resize(src, dst) # cv.SaveImage("/tmp/resized.jpg",dst) src = dst dst = cv.CreateImage(cv.GetSize(src), 8, 1) color_dst = cv.CreateImage(cv.GetSize(src), 8, 3) storage = cv.CreateMemStorage(0) cv.Canny(src, dst, 50, 200, 3) cv.CvtColor(dst, color_dst, cv.CV_GRAY2BGR) slopes = [] # difference between xs or ys - variant of slope tilts = [] # x coordinates of horizontal lines horizontals = [] # y coordinates of vertical lines verticals = [] if USE_STANDARD: coords = cv.HoughLines2(dst, storage, cv.CV_HOUGH_STANDARD, 1, pi / 180, 50, 50, 10) lines = [] for coord in coords: (rho, theta) = coord a = cos(theta) b = sin(theta) x0 = a * rho y0 = b * rho pt1 = (cv.Round(x0 + 1000 * (-b)), cv.Round(y0 + 1000 * (a))) pt2 = (cv.Round(x0 - 1000 * (-b)), cv.Round(y0 - 1000 * (a))) lines += [(pt1, pt2)] else: lines = cv.HoughLines2(dst, storage, cv.CV_HOUGH_PROBABILISTIC, 1, pi / 180, 50, 50, 10) # eliminate duplicates - there are many especially with the standard version # first round the coordinates to integers divisible with 5 (to eliminate different but really close ones) # TODO # lines = list(set(map(lambda l: tuple([int(p) - int(p)%5 for p in l]), lines))) nr_straight_lines = 0 for line in lines: (pt1, pt2) = line # compute slope, rotate the line so that the slope is smallest # (slope is either delta x/ delta y or the reverse) # add smoothing term in denominator in case of 0 slope = min( abs(pt1[1] - pt2[1]), (abs(pt1[0] - pt2[0]))) / (max(abs(pt1[1] - pt2[1]), (abs(pt1[0] - pt2[0]))) + 0.01) # if slope < 0.1: # if slope < 5: if slope < 0.05: if abs(pt1[0] - pt2[0]) < abs(pt1[1] - pt2[1]): # means it's a horizontal line horizontals.append(pt1[0]) else: verticals.append(pt1[1]) if slope < 0.05: # if slope < 5: # if slope < 0.1: nr_straight_lines += 1 slopes.append(slope) tilts.append(min(abs(pt1[1] - pt2[1]), (abs(pt1[0] - pt2[0])))) # print slope average_slope = sum(slopes) / float(len(slopes)) median_slope = npmedian(nparray(slopes)) average_tilt = sum(tilts) / float(len(tilts)) median_tilt = npmedian(nparray(tilts)) differences = [] horizontals = sorted(horizontals) verticals = sorted(verticals) print "x_differences:" for (i, x) in enumerate(horizontals): if i > 0: # print abs(horizontals[i] - horizontals[i-1]) differences.append(abs(horizontals[i] - horizontals[i - 1])) print "y_differences:" for (i, y) in enumerate(verticals): if i > 0: # print abs(verticals[i] - verticals[i-1]) differences.append(abs(verticals[i] - verticals[i - 1])) print filename print "average_slope:", average_slope print "median_slope:", median_slope print "average_tilt:", average_tilt print "median_tilt:", median_tilt median_differences = npmedian(nparray(differences)) print "median_differences:", median_differences if not differences: # big random number for average difference average_differences = 50 else: average_differences = sum(differences) / float(len(differences)) print "average_differences:", average_differences print "nr_lines:", nr_straight_lines # print "sorted xs:", sorted(lines) return (average_slope, median_slope, average_tilt, median_tilt, median_differences, average_differences, nr_straight_lines)
import cv2.cv as cv import urllib2 # toggle between CV_HOUGH_STANDARD and CV_HOUGH_PROBILISTIC USE_STANDARD = True if __name__ == "__main__": if len(sys.argv) > 1: filename = sys.argv[1] src = cv.LoadImage(filename, cv.CV_LOAD_IMAGE_GRAYSCALE) else: url = 'http://code.opencv.org/svn/opencv/trunk/opencv/doc/pics/building.jpg' filedata = urllib2.urlopen(url).read() imagefiledata = cv.CreateMatHeader(1, len(filedata), cv.CV_8UC1) cv.SetData(imagefiledata, filedata, len(filedata)) src = cv.DecodeImageM(imagefiledata, cv.CV_LOAD_IMAGE_GRAYSCALE) cv.NamedWindow("Source", 1) cv.NamedWindow("Hough", 1) while True: dst = cv.CreateImage(cv.GetSize(src), 8, 1) color_dst = cv.CreateImage(cv.GetSize(src), 8, 3) storage = cv.CreateMemStorage(0) lines = 0 cv.Canny(src, dst, 50, 200, 3) cv.CvtColor(dst, color_dst, cv.CV_GRAY2BGR) if USE_STANDARD: lines = cv.HoughLines2(dst, storage, cv.CV_HOUGH_STANDARD, 1, pi / 180, 100, 0, 0)
def lin2srgb(x): a = 0.055 return numpy.where(x <= 0.0031308, x * 12.92, (1 + a) * numpy.power(x, 1 / 2.4) - a) if __name__ == "__main__": if len(sys.argv) > 1: img0 = cv.LoadImageM(sys.argv[1], cv.CV_LOAD_IMAGE_COLOR) else: url = 'http://code.opencv.org/svn/opencv/trunk/opencv/samples/c/lena.jpg' filedata = urllib2.urlopen(url).read() imagefiledata = cv.CreateMatHeader(1, len(filedata), cv.CV_8UC1) cv.SetData(imagefiledata, filedata, len(filedata)) img0 = cv.DecodeImageM(imagefiledata, cv.CV_LOAD_IMAGE_COLOR) cv.NamedWindow("original", 1) cv.ShowImage("original", img0) # Image was originally bytes in range 0-255. Turn it into an array of floats in range 0.0 - 1.0 n = numpy.asarray(img0) / 255.0 # Use NumPy to do some transformations on the image # Negate the image by subtracting it from 1.0 cv.NamedWindow("negative") cv.ShowImage("negative", cv.fromarray(1.0 - n)) # Assume the image was sRGB, and compute the linear version. cv.NamedWindow("linear")