python - TypeError: array is not a numpy array, neither a scalar -
i'm trying run script error
"typeerror: array not numpy array, neither scalar" on line 60
moment = cv.moments(points)
i didn't make script, here
https://github.com/openalpr/train-detector/blob/master/crop_plates.py
and modified bit in order work
- changed "import cv" "import cv2 cv" since couldn't make work (ref: no module named cv)
- changed line 60 "moment = cv.moments(points)" "moment = cv.moments(points)" (the capital m)
the script:
#!/usr/bin/python import os import sys import json import math import cv2 import cv2 cv import numpy np import copy import yaml argparse import argumentparser parser = argumentparser(description='openalpr license plate cropper') parser.add_argument( "--input_dir", dest="input_dir", action="store", type=str, required=true, help="directory containing plate images , yaml metadata" ) parser.add_argument( "--out_dir", dest="out_dir", action="store", type=str, required=true, help="directory output cropped plates" ) parser.add_argument( "--zoom_out_percent", dest="zoom_out_percent", action="store", type=float, default=1.25, help="percent multiplier zoom out before cropping" ) parser.add_argument( "--plate_width", dest="plate_width", action="store", type=float, required=true, help="desired aspect ratio width" ) parser.add_argument( "--plate_height", dest="plate_height", action="store", type=float, required=true, help="desired aspect ratio height" ) options = parser.parse_args() if not os.path.isdir(options.input_dir): print "input_dir (%s) doesn't exist" sys.exit(1) if not os.path.isdir(options.out_dir): os.makedirs(options.out_dir) def get_box(x1, y1, x2, y2, x3, y3, x4, y4): height1 = int(round(math.sqrt((x1-x4)*(x1-x4) + (y1-y4)*(y1-y4)))) height2 = int(round(math.sqrt((x3-x2)*(x3-x2) + (y3-y2)*(y3-y2)))) height = height1 if height2 > height: height = height2 # add 25% height height *= options.zoom_out_percent #height += (height * .05) #print "height: %d - %d" % (height1, height2) points = [(x1,y1), (x2,y2), (x3,y3), (x4,y4)] moment = cv.moments(points) centerx = int(round(moment.m10/moment.m00)) centery = int(round(moment.m01/moment.m00)) training_aspect = options.plate_width / options.plate_height width = int(round(training_aspect * height)) # top_left = ( int(centerx - (width / 2)), int(centery - (height / 2))) # bottom_right = ( int(centerx + (width / 2)), int(centery + (height / 2))) top_left_x = int(round(centerx - (width / 2))) top_left_y = int(round(centery - (height / 2))) return (top_left_x, top_left_y, width, int(round(height))) def crop_rect(big_image, x,y,width,height): # crops rectangle big image , returns cropped image # special care taken avoid cropping beyond edge of image. # fills area in random pixels (big_height, big_width, channels) = big_image.shape if x >= 0 , y >= 0 , (y+height) < big_height , (x+width) < big_width: crop_img = img[y:y+height, x:x+width] else: #print "performing partial crop" #print "x: %d y: %d width: %d height: %d" % (x,y,width,height) #print "big_width: %d big_height: %d" % (big_width, big_height) crop_img = np.zeros((height, width, 3), np.uint8) cv2.randu(crop_img, (0,0,0), (255,255,255)) offset_x = 0 offset_y = 0 if x < 0: offset_x = -1 * x x = 0 width -= offset_x if y < 0: offset_y = -1 * y y = 0 height -= offset_y if (x+width) >= big_width: offset_x = 0 width = big_width - x if (y+height) >= big_height: offset_y = 0 height = big_height - y #print "offset_x: %d offset_y: %d, width: %d, height: %d" % (offset_x, offset_y, width, height) original_crop = img[y:y+height-1, x:x+width-1] (small_image_height, small_image_width, channels) = original_crop.shape #print "small shape: %dx%d" % (small_image_width, small_image_height) # draw small image onto large image crop_img[offset_y:offset_y+small_image_height, offset_x:offset_x+small_image_width] = original_crop #cv2.imshow("test", crop_img) return crop_img count = 1 yaml_files = [] in_file in os.listdir(options.input_dir): if in_file.endswith('.yaml') or in_file.endswith('.yml'): yaml_files.append(in_file) yaml_files.sort() yaml_file in yaml_files: print "processing: " + yaml_file + " (" + str(count) + "/" + str(len(yaml_files)) + ")" count += 1 yaml_path = os.path.join(options.input_dir, yaml_file) yaml_without_ext = os.path.splitext(yaml_path)[0] open(yaml_path, 'r') yf: yaml_obj = yaml.load(yf) image = yaml_obj['image_file'] # skip missing images full_image_path = os.path.join(options.input_dir, image) if not os.path.isfile(full_image_path): print "could not find image file %s, skipping" % (full_image_path) continue plate_corners = yaml_obj['plate_corners_gt'] cc = plate_corners.strip().split() in range(0, len(cc)): cc[i] = int(cc[i]) box = get_box(cc[0], cc[1], cc[2], cc[3], cc[4], cc[5], cc[6], cc[7]) img = cv2.imread(full_image_path) crop = crop_rect(img, box[0], box[1], box[2], box[3]) # cv2.imshow("test", crop) # cv2.waitkey(0) out_crop_path = os.path.join(options.out_dir, yaml_without_ext + ".jpg") cv2.imwrite(out_crop_path, crop ) print "%d cropped images located in %s" % (count-1, options.out_dir)
i don't have knowledge of python. either find way solve error or find out how install module cv.
os windows 7, python 2.7 thanks,
- try printing contents of "points" before calculating moments.
- if there nothing wrong "points", try
cv.moments(np.int32(points))
Comments
Post a Comment