2017-08-14 19 views
1

我試圖運行此腳本,但我得到這個錯誤類型錯誤:數組不是numpy的陣列,無論是標量

「類型錯誤:數組不是numpy的陣列,無論是標量」上線60

moment = cv.moments(points) 

我沒有劇本,我們是從這裏

https://github.com/openalpr/train-detector/blob/master/crop_plates.py

,我修改了它有點爲了工作

  • 改爲 「進口品種」 到 「進口CV2爲CV」 因爲我無法使它工作(參考:No module named cv
  • 改變的線60從 「時刻= cv.Moments(點)」 到「此刻= cv.moments(點)」(M大寫)

腳本:

#!/usr/bin/python 

import os 
import sys 
import json 
import math 
import cv2 
import cv2 as cv 
import numpy as np 
import copy 
import yaml 
from 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 and yaml metadata") 

parser.add_argument("--out_dir", dest="out_dir", action="store", type=str, required=True, 
        help="Directory to output cropped plates") 

parser.add_argument("--zoom_out_percent", dest="zoom_out_percent", action="store", type=float, default=1.25, 
        help="Percent multiplier to 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% to the 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 the rectangle from the big image and returns a cropped image 
    # Special care is taken to avoid cropping beyond the edge of the image. 
    # It fills this area in with random pixels 

    (big_height, big_width, channels) = big_image.shape 
    if x >= 0 and y >= 0 and (y+height) < big_height and (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 the small image onto the 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 = [] 
for 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() 

for 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] 
    with open(yaml_path, 'r') as 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() 
    for i 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 are located in %s" % (count-1, options.out_dir) 

我沒有Python中的任何知識。我可以找到解決這個錯誤的方法或找出如何安裝模塊cv。

操作系統是Windows 7,Python是2.7 感謝,

+0

你沒有按照建議你聯繫的答案完全相同。你有'進口cv2作爲cv',但答案是'import cv2.cv as cv' –

+0

檢查我的評論下面的答案,我得到這個錯誤:http://imgur.com/WIZh0EK – Vallo

+0

這不是一個調試服務。 *你已經做了什麼*來嘗試調試呢?錯誤消息很明顯 - 函數需要一個數組,但不會將'points'識別爲數組。你有沒有嘗試在函數調用之前進行調試'print(points,type(points))'?你會注意到,這是一個'list',而不是'numpy.ndarray' ... –

回答

1
  1. 嘗試計算的前一刻打印 「點」 的內容。
  2. 如果有什麼不對的「點」,儘量cv.Moments(np.int32(points))
相關問題