2016-02-25 6 views
1

, когда я запустить программу мне нужно мой код:сравнить одно изображение с 10 или более изображений и найти соответствие один

  1. инициализировать камеру
  2. Сфотографируйте
  3. запрос пользователя ввести пути для текущего изображения, которое должно быть сохранено, и изображение, которое нужно сравнить с
  4. определить края текущего снимка и сохранить в базе данных
  5. сравнить текущее изображение края с 10 или более изображениями в базе данных
  6. выход как края изображения, которое имеет самый высокий процент совпадения с током изображения края

в основном его как программа идентификации объекта ... может кто-то пожалуйста, помогите мне?

здесь код я сделал до сих пор

from itertools import izip 

import numpy as np 
import cv2 
from matplotlib import pyplot as plt 
from PIL import Image 



def take_and_save_picture(im_save): 
    '''Take a picture and save it 

    Args: 
    im_save: filepath where the image should be stored 
    ''' 
    camera_port = 0 
    ramp_frames = 30 
    cap = cv2.VideoCapture(camera_port) 
    def get_image(): 
    retval, im = cap.read() 
    return im 

    for i in xrange(ramp_frames): 
    temp = get_image() 

    print("Taking image...") 
    # Take the actual image we want to keep 
    camera_capture = get_image() 

    #im_save_tmp = im_save + '.jpg' 
    im_save_tmp = im_save 

    # A nice feature of the imwrite method is that it will automatically choose the 
    # correct format based on the file extension you provide. Convenient! 
    cv2.imwrite(im_save_tmp, camera_capture) 

    # You'll want to release the camera, otherwise you won't be able to create a new 
    # capture object until your script exits 
    # del(cap) 

    img1 = cv2.imread(im_save_tmp, 0) 

    edges = cv2.Canny(img1, 100, 200) 
    cv2.imwrite(im_save, edges) 
    cv2.waitKey(0) 
    cv2.destroyAllWindows() 

#im1 = "/Users/Me/gop.jpg" 
#im2 = "/Users/Me/aarthi.jpg" 
im1 = input('enter the path of database file') 
im2 = input('enter the path where captured image is to be saved') 
#im1="/Users/Me/home1.png" 
#im2="/Users/Me/home.png" 

def compute_edges_diff(im1, im2): 
    '''Compute edges diff between to image files. 

    Args: 
    im1: filepath to the first image 
    im2: filepath to the second image 

    Returns: 
    float: percentage of difference between images 
    ''' 
#for no_file1 in range(0,10): 
    #template = cv2.imread('numbers1/{no_file}.png'.format(no_file=no_file1),0) 
    i1 = Image.open(im1) 
    i2 = Image.open(im2) 
    assert i1.mode == i2.mode, "Different kinds of images." 
    assert i1.size == i2.size, "Different sizes." 

    pairs = izip(i1.getdata(), i2.getdata()) 
    if len(i1.getbands()) == 1: 
     # for gray-scale jpegs 
     dif = sum(abs(p1-p2) for p1,p2 in pairs) 
    else: 
     dif = sum(abs(c1-c2) for p1,p2 in pairs for c1,c2 in zip(p1,p2)) 

    ncomponents = i1.size[0] * i1.size[1] * 3 
    diff = (dif/255.0 * 100)/ncomponents 
    return diff 

def main(): 
    #capture_img = "/Users/Me/home1.png" 
    capture_img = input('enter path of the file from database') 
    #img_to_compare = "/Users/Me/Documents/python programs/compare/img2.jpg" 
    take_and_save_picture(capture_img) 
    diff = compute_edges_diff(im1, im2) 
    print "Difference (percentage):", diff 
    if diff > 0.5: 
    print im1 
    else : 
    print im2 

if __name__ == '__main__': 
    main() 

#del(cap) 

этот код прекрасно работает .. но я могу сравнить только один образ ... Мне нужно, чтобы сравнить текущие принятые изображения со всеми изображениями в моя база данных ...

ответ

0

в вашей основной функции, создать список, чтобы попросить пути для файлов изображений, оберните сравнить в цикле:

def get_images_to_compare(): 
    images_to_compare = [] 
    while True: 
     comp_img = raw_input("Path of image to compare to: ") 
     if len(comp_img) <= 1: 
      # break if someone just hits enter 
      break 
     images_to_compare.append(comp_img) 
    return images_to_compare 

def main(): 
    #capture_img = "/Users/Me/home1.png" 
    capture_img = input('enter path of the file from database') 
    #img_to_compare = "/Users/Me/Documents/python programs/compare/img2.jpg" 
    take_and_save_picture(capture_img) 
    #### you have some odd var names here, basic gist, add a for loop 
    for comp_image in get_images_to_compare(): 
     diff = compute_edges_diff(im1, im2) 
     print "Difference (percentage):", diff 
     if diff > 0.5: 
      print im1 
     else: 
      print im2 

как предложение, избежать глобального СБН ope vars смешивается между функциями, он делает код трудным для чтения (ссылаясь на то, что вы устанавливаете im1 и im2 между двумя fn defs.

код для выполнения многократного сравнения:

def main(folder_path_to_search, files_to_compare_to, source_image_path): 
    #capture_img = "/Users/Me/home1.png" 
    capture_img = input('enter path of the file from database') 
    #img_to_compare = "/Users/Me/Documents/python programs/compare/img2.jpg" 
    take_and_save_picture(capture_img) 

    images_to_compare = [ os.path.join(folder_path_to_search,file_path) for file_path in os.listdir(folder_path_to_search) if file_path.endswith(files_to_compare_to) ] 

    for comp_image in get_images_to_compare(): 
     diff = compute_edges_diff(source_image_path, comp_image) 
     print "Difference (percentage):", diff, "(", source_image_path, ":", comp_image, ")" 


if __name__ == '__main__': 
    folder_path_to_search = raw_input("Enter folder path to search") 
    files_to_compare_to = raw_input("enter file extention to glob ex: '.jpg'") 
    source_image_path  = raw_input("enter full file path of source image") 
    main(folder_path_to_search, files_to_compare_to, source_image_path) 
+0

но этот код запрашивает путь каждый раз, когда ... Мне нужен код, чтобы сравнить текущее изображение с 10 изображений в папке prticular ... например : если в файле записано 10 изображений, и теперь будет снято одно изображение ... мне нужна система, чтобы сравнить захваченное изображение со всеми 10 изображениями в этой конкретной папке и принести мне ту, которая имеет наименьший процент разницы .... – rohini

+0

если это так, вы можете заменить функцию get_images_to_compare на [os.path.join (base_path, file_path) для file_path в os.listdir (base_path), если file_path.endswith ('. jpg' <или какой-либо другой шаблон файла>)] – pyInTheSky

+0

... я не так хорошо с кодом python .. может у, пожалуйста, дайте мне правильный синтаксис ... – rohini