ACRS-Titech / DataBase

DataBase Creation
0 stars 0 forks source link

DataBase_v2.py #3

Open ACRS-Titech opened 8 years ago

ACRS-Titech commented 8 years ago

-- coding:utf-8 --

import os import sys from PIL import Image import numpy as np import cv2 from matplotlib import pylab as plt import sqlite3 from PIL.ExifTags import TAGS, GPSTAGS

入力画像

img='KandaMyoujin.jpg'

img_Num=np.array(Image.open(img))

img_New=np.zeros((len(img_Num[:,0]),(len(img_Num[0,:]))))

Gray_Scale process

for i in range(len(img_Num[:,0])):

for j in range(len(img_Num[0,:])):

img_New[i,j]=int(round(0.299_img_Num[i,j][0]+0.587_img_Num[i,j][1]+0.114*img_Num[i,j][2]))

img_gray = Image.fromarray(np.uint8(img_New))

img_gray.show()

<特徴点抽出>

def process_image(imagename,resultname,params="--edge-thresh 10 --peak-thresh 5"): """ 画像を処理してファイルに結果を保存する """

if imagename[-3:] != 'pgm':

pgmファイルを作成する

im = Image.open(imagename).convert('L')
im.save('tmp.pgm')
imagename = 'tmp.pgm'

cmmd = str("./sift "+imagename+" --output="+resultname+ " "+params) os.system(cmmd) print 'processed', imagename, 'to', resultname

def read_features_from_file(filename):

f = np.loadtxt(filename) return f[:,:4],f[:,4:]

def match(desc1,desc2): desc1 = np.array([d/np.linalg.norm(d) for d in desc1]) desc2 = np.array([d/np.linalg.norm(d) for d in desc2])

dist_ratio = 0.6 desc1_size = desc1.shape

matchscores = np.zeros(desc1_size[0],'int') desc2t = desc2.T

for i in range(desc1_size[0]): dotprods = np.dot(desc1[i,:],desc2t) dotprods = 0.9999*dotprods indx = np.argsort(np.arccos(dotprods))

if np.arccos(dotprods)[indx[0]] < dist_ratio * np.arccos(dotprods)[indx[1]]:
  matchscores[i] = int(indx[0])

return matchscores

sname=img+'.sift' process_image(img,sname) l1,d1 = read_features_from_file(sname)

print 'Sift',l1

print d1

print '\n'

<EXIF情報の取得>

ExifからGPSの取得

def get_exif(file): img = Image.open(file) df=np.array(Image.open(file)) exif = img._getexif()

exif_data = [] for id, value in exif.items():

print 'ID',TAGS.get(id),'\n'

ID = TAGS.get(id)
tag = TAGS.get(id, id),value
#print 'Tag',tag,'\n'
if ID == 'GPSInfo': 
  exif_data.extend(tag)

return exif_data

緯度・経度の算出関数(10進数)

def calculate(GPS): lat_ex=GPS[1][2] lon_ex=GPS[1][4] lat_a=float(lat_ex[0][0]/lat_ex[0][1]) lat_b=float(lat_ex[1][0]/lat_ex[1][1]) lat_c=float(lat_ex[2][0]/lat_ex[2][1]) lat=lat_a+(lat_b/60.0)+(lat_c/60.0/60.0)

lon_a=float(lon_ex[0][0]/lon_ex[0][1]) lon_b=float(lon_ex[1][0]/lon_ex[1][1]) lon_c=float(lon_ex[2][0]/lon_ex[2][1]) lon=lon_a+(lon_b/60.0)+(lon_c/60.0/60.0) return lat,lon

GPS=get_exif(img) lat,lon=calculate(GPS) print lat,lon

<データベース作成 by sqlite3 > すみません・・・ここわからない

conn = sqlite3.connect('ACRS.db')

cur = conn.cursor()

cur.execute("""CREATE TABLE feature_Point(title ,lat , lon , d1, l1, img);""")

ベースになる画像(jpg)データを保存したフォルダ Data_Box

DataBox内のimgの名前、検出した特徴点情報,Exifのlat,lon,jpgのRGB情報をテーブルに格納(未完成)

path = 'Data_Box' imlist = [os.path.join(path,f) for f in os.listdir(path) if f.endswith('.jpg')]

次のプロセスに渡す画像を入れるリスト

list_Img=[]

データベース格納のための特徴点、GPS情報の算出

for img_ex in imlist: RGB=np.array(Image.open(img_ex)) sname = img_ex+'.sift' process_image(img_ex,sname) l_db,d_db = read_features_from_file(sname) GPS_db=get_exif(img_ex) lat_db,lon_db=calculate(GPS) print 'Data',lat_db,lon_db

cur.execute("""INSERT INTO feature_Point(title,lat,lon) VALUES(img_ex,lat_db,lon_db)""")

conn.commit()

本来ならばここでデータベース上に特徴点情報とGPS情報を格納できたはず・・・

本来ならば・・・データベースからGPS情報を呼び出して以下のif文(現時点では適当)でフィルタ

if abs(lat-lat_db)<0.5 and abs(lon-lon_db)<0.5:

本来ならば・・・フィルタ通過した画像の特徴点情報をデータベースから呼び出し

#入力画像とフィルタ通過したデータベース画像の特徴点マッチング開始
matches = match(d1,d_db)
#共通特徴点数の閾値
if sum(matches)>50:
  nbr_matches = sum(matches > 0)
  print 'number of matches = ', nbr_matches
  #matchscores[i,j] = nbr_matches
  print 'imagename:{0}'.format(img_ex)
  #次のプロセス画像としてリターンされる画像のRGB
  list_Img.append(RGB)
else:
  print 'not mutch'
debuops commented 8 years ago

ISSUEに置くとコードが見難い上に、cloneできないので、codeのところに置いてください