現在pythonでアイマス画像の類似度比較アプリを作っているのですが詰まったのでヒントが欲しいです。
処理工程はこのようになります。
1:webスクレイピング
2:web上の画像(一枚)をtemp.jpgに保存
3:あらかじめ保存しておいた比較元画像とtemp.jpgの類似度を求める
4:類似度が高い場合temp.jpgを別名で保存 (今は類似度完全一致で求めています)
画像の枚数分繰り返す
画像が数枚程度なら速度は気にならないのですが、5000枚ほどの画像と比較するのでとても遅いです。先に全部保存しておいて比較する方法も試すつもりですが、目標はこの工程で、と考えています。可能か不可能か、また可能ならそれはどのような処理か、不可能ならどう変更すればよいかを教えていただきたいです。
あと、画像見つけた時に処理を終えるために多重ループの良い抜け方も教えていただきたいです...
以下現在までのコードです。
import requests
import shutil
from bs4 import BeautifulSoup
import cv2
import os
IMAS_SITE_PATH = 'http://125.6.169.35/idolmaster/image_sp/card/l/'
COMPARING_IMG_PATH = "c:\\imas\\image\\temp.jpg"
IMG_DIR = os.path.abspath(os.path.dirname(__file__)) + '/image/'
IMG_SIZE = (640,800)
TARGET_FILE = 'target.jpg'
SEARCH_FILE = 'c:\\imas\\image\\search.jpg'
End_Flag = False
def download_img(url, file_name): # 画像ダウンロード&保存
r = requests.get(url, stream=True)
if r.status_code == 200:
with open(file_name, 'wb') as f:
r.raw.decode_content = True
shutil.copyfileobj(r.raw, f)
def get_target_hist(): # 比較元画像のヒストグラム取得
target_img_path = IMG_DIR + TARGET_FILE
target_img = cv2.imread(target_img_path)
target_img = cv2.resize(target_img,IMG_SIZE)
target_hist = cv2.calcHist([target_img],[0],None,[256],[0, 256])
return target_hist
def comparing(target_hist): #比較対象画像のヒストグラム取得&比較
comparing_img_path = COMPARING_IMG_PATH
comparing_img = cv2.imread(comparing_img_path)
comparing_img = cv2.resize(comparing_img, IMG_SIZE)
comparing_hist = cv2.calcHist([comparing_img],[0],None,[256],[0,256])
ret = cv2.compareHist(target_hist, comparing_hist, 0)
return ret
"""メイン"""
for idol_cnt in range(1, 204):
if End_Flag == True:
os.remove(COMPARING_IMG_PATH)
break
req = requests.get("http://imas.gamedbs.jp/cg/idol/detail/" + str(idol_cnt))
soup = BeautifulSoup(req.text, "lxml")
a = soup.find_all("a", class_="swap-card")
for image in a:
img = image.find("img")
data = img['data-original']
imas_card_path = data[21:]
CARD_PATH = IMAS_SITE_PATH + imas_card_path
download_img(CARD_PATH,COMPARING_IMG_PATH)
ret = comparing(get_target_hist())
if ret == 1.0:
shutil.copyfile(COMPARING_IMG_PATH,SEARCH_FILE)
End_Flag = True