圖形辨識~尋寶遊戲

閱讀時間約 23 分鐘
系統架構
構想上,前端簡單的使用Google Map 做定位,並寫入SQL做第一段比對經緯度。接著前端有一個php上傳圖片的功能(沒有 https 所以就不做網頁開相機的方式)。經過上傳至伺服器後,python 圖形辨識,比對上傳的圖片,若比對成功或相似度差異不大,則判定正確,寫入SQL,端頁面顯示奪寶成功。Firebase部分則為即時聊天(有空在搞...)

前端頁面 index.php

<!DOCTYPE html>
<html>
  <head>
    <title>尋寶遊戲</title>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no">
    <meta charset="utf-8">
    <style>
      /* Always set the map height explicitly to define the size of the div
       * element that contains the map. */
      #map {
        height: 100%;
      }
      /* Optional: Makes the sample page fill the window. */
      html, body {
        height: 100%;
        margin: 0;
        padding: 0;
      }
#bg{
    position:absolute;
    left:0px;
    top:0px;
    z-index:9;
	 margin:0px auto;
	 width:200px;
	 height:140px;
	 display: flex;
    /* 水平置中 */
    justify-content: center;    
    /* 垂直置中 */
    align-items: center; 
	 background:rgba(0,255,204,0.2);
	 border-style:dotted;
	 border-color:#FF0000;
	 padding:1px;
}
#cc{
    z-index:99;
}
    </style>
  </head>
  <body>
  <?
  if (isset($_GET["a"]) && $_GET["a"]=="ok")
  {
  ?>
    <div id="bg">
		<div id="cc"><b>找到了~</b></div>
	 </div>
	<?
  }
  
  if (isset($_GET["a"]) && $_GET["a"]=="ng")
  {
	?>
    <div id="bg">
		<div id="cc"><b>沒找到唷~</b></div>
	 </div>
	<?
  }
	?>
    <div id="map"></div>
    <script>
      // Note: This example requires that you consent to location sharing when
      // prompted by your browser. If you see the error "The Geolocation service
      // failed.", it means you probably did not give permission for the browser to
      // locate you.
      var map, infoWindow;
	  var la,lo;
      function initMap() {
        map = new google.maps.Map(document.getElementById('map'), {
          center: {lat: -34.397, lng: 150.644},
          zoom: 18
        });
		
		/*
		var contentString = 'lat: '+la+' , '+'lon: '+lo;
        //infoWindow = new google.maps.InfoWindow;
		
		  infowindow = new google.maps.InfoWindow({
          content: contentString
        });
		*/
		
        // Try HTML5 geolocation.
        if (navigator.geolocation) {
          navigator.geolocation.getCurrentPosition(function(position) {
            var pos = {
              lat: position.coords.latitude,
              lng: position.coords.longitude
            };
			
			la=position.coords.latitude;
			lo=position.coords.longitude;
			contentString = '<div>尋寶Game</div>'+
			'<form method="post" enctype="multipart/form-data" action="upload.php">'+
			'<input name="file" type="file"><input name="upload" type="submit" value="上傳">'+
			'</form>'+
			'lat: '+la+' , '+'lon: '+lo;
			
			infowindow = new google.maps.InfoWindow({
			 content: contentString
			});
			
			var marker = new google.maps.Marker({
                    position: pos,
                    //icon:'marker.png',
                    map: map
                });
				marker.addListener('click', function() {
				infowindow.open(map, marker);
				});
				map.setZoom(17);
                map.setCenter(pos);
				
            //infoWindow.setPosition(pos);
            //infoWindow.setContent('Location found.');
            //infoWindow.open(map);
            //map.setCenter(pos);
          }, function() {
            handleLocationError(true, infoWindow, map.getCenter());
          });
        } else {
          // Browser doesn't support Geolocation
          handleLocationError(false, infoWindow, map.getCenter());
        }
      }
      function handleLocationError(browserHasGeolocation, infoWindow, pos) {
        infoWindow.setPosition(pos);
        infoWindow.setContent(browserHasGeolocation ?
                              'Error: The Geolocation service failed.' :
                              'Error: Your browser doesn\'t support geolocation.');
        infoWindow.open(map);
      }
    </script>
     <script
      src="https://maps.googleapis.com/maps/api/js?key=AIzaSyB41DRUbKWJHPxaFjMAwdrzWzbVKartNGg&callback=initMap&v=weekly"
      defer
    ></script>
  </body>
</html>

圖檔上傳 upload.php

<?php
print_r($_POST);
print_r($_FILES);//或使用var_dump
//試著理解以下內容與差異
echo $_FILES["file"]["name"]."<br/>";	//原檔案名稱
echo $_FILES["file"]["tmp_name"]."<br/>";//暫存路徑
echo $_FILES["file"]["size"]."<br/>";//檔案byte, max 2mb,除非要改php上傳限制
echo $_FILES["file"]["type"]."<br/>";//檔案類型
//將檔案儲存到伺服器位置的方式為
//copy($_FILES["file"]["tmp_name"],"./".$_FILES["file"]["name"]); // copy(from,to)
//上傳檔案時也可以改名
//$newname=date("YmdHis")."_".$_FILES["file"]["name"];
//copy($_FILES["file"]["tmp_name"],"./".$newname); // copy(from,to)
copy($_FILES["file"]["tmp_name"],"1.jpg"); // copy(from,to)
//unlink("upload/".$newname);  //刪除網路空間內的檔案
sleep(2);
$txt_file = fopen('output.txt','r');
$line = fgets($txt_file);
fclose($txt_file);
echo $line;
header("Location: index.php?a=".$line);
?>
<!--
<form method="post" enctype="multipart/form-data">
<input type="file" name="mypic">
<input type="submit" value="上傳">
</form>-->

Python 檔案是否存在

import os
# 要檢查的檔案路徑
filepath = "0.jpg"
# 檢查檔案是否存在
if os.path.isfile(filepath):
  print("檔案存在。")
else:
  print("檔案不存在。")

安裝 Pillow

pip install Pillow

Python 圖形辨識 相似度

# -*- coding:utf-8 -*-
from functools import reduce
from PIL import Image
# 計算圖片的局部哈希值--pHash
def phash(img):
    """
    :param img: 圖片
    :return: 返回圖片的局部hash值
    """
    img = img.resize((8, 8), Image.ANTIALIAS).convert('L')
    avg = reduce(lambda x, y: x + y, img.getdata()) / 64.
    hash_value=reduce(lambda x, y: x | (y[1] << y[0]), enumerate(map(lambda i: 0 if i < avg else 1, img.getdata())), 0)
    print(hash_value)
    return hash_value
# 計算漢明距離:
def hamming_distance(a, b):
    """
    :param a: 圖片1的hash值
    :param b: 圖片2的hash值
    :return: 返回兩個圖片hash值的漢明距離
    """
    hm_distance=bin(a ^ b).count('1')
    print(hm_distance)
    return hm_distance
# 計算兩個圖片是否相似:
def is_imgs_similar(img1,img2):
    """
    :param img1: 圖片1
    :param img2: 圖片2
    :return:  True 圖片相似  False 圖片不相似
    """
    return True if hamming_distance(phash(img1),phash(img2)) <= 5 else False
if __name__ == '__main__':
    # 讀取圖片
    sensitive_pic = Image.open("0.jpg")
    target_pic = Image.open("2.jpg")
    # 比較圖片相似度
    result=is_imgs_similar(target_pic, sensitive_pic)
    print(result)

Python 偵測檔案 + 比對相似度

# -*- coding:utf-8 -*-
from functools import reduce
from PIL import Image
import os
import pymysql
# 計算圖片的局部哈希值--pHash
def phash(img):
    """
    :param img: 圖片
    :return: 返回圖片的局部hash值
    """
    img = img.resize((8, 8), Image.ANTIALIAS).convert('L')
    avg = reduce(lambda x, y: x + y, img.getdata()) / 64.
    hash_value=reduce(lambda x, y: x | (y[1] << y[0]), enumerate(map(lambda i: 0 if i < avg else 1, img.getdata())), 0)
    #print(hash_value)
    return hash_value
# 計算漢明距離:
def hamming_distance(a, b):
    """
    :param a: 圖片1的hash值
    :param b: 圖片2的hash值
    :return: 返回兩個圖片hash值的漢明距離
    """
    hm_distance=bin(a ^ b).count('1')
    #print(hm_distance)
    return hm_distance
# 計算兩個圖片是否相似:
def is_imgs_similar(img1,img2):
    """
    :param img1: 圖片1
    :param img2: 圖片2
    :return:  True 圖片相似  False 圖片不相似
    """
    return True if hamming_distance(phash(img1),phash(img2)) <= 5 else False
# 資料庫設定
db_settings = {
    "host": "127.0.0.1",
    "port": 3306,
    "user": "root",
    "password": "資料庫管理員密碼",
    "db": "test2022",
    "charset": "utf8"
}
if __name__ == '__main__':
    while True:
# 要檢查的檔案路徑
        filepath = "1.jpg"
# 檢查檔案是否存在
        if os.path.isfile(filepath):
         #print("檔案存在。")
     # 讀取圖片
         #fp = open(filepath,'rb')
         sensitive_pic = Image.open("0.jpg")
         target_pic = Image.open(filepath)
         
     # 比較圖片相似度
         result=is_imgs_similar(target_pic, sensitive_pic)
         a=result
         print(a)
         path = 'output.txt'
          
         if a==True:
          #print("ok")
          f = open(path, 'w')
          f.write('ok')
          f.close()
 
         else:
          #print("ng")
          f = open(path, 'w')
          f.write('ng')
          f.close()
          
        else:
         print("檔案不存在。")
原本打算用SQL處理,不過有點懶...所以就用文字檔的方式處理...以後有空在搞囉~
即將進入廣告,捲動後可繼續閱讀
為什麼會看到廣告
40會員
130內容數
獨立遊戲開發紀錄
留言0
查看全部
發表第一個留言支持創作者!
吳佳鑫的沙龍 的其他內容
本專題為兩塊ESP8266-ESP01 ,分別為 Arduino+ESP-01+YL-69 土壤濕度檢測器與LED燈 ,以及 ESP-01 + DHT11 + LED 傳輸給伺服器端,並於伺服器上 WebSite 透過ESP-01上傳儲 存於 MYSQL 資料呈現曲線圖給前端使用者。此外,前端使用者
本專題為兩塊ESP8266-ESP01 ,分別為 Arduino+ESP-01+YL-69 土壤濕度檢測器與LED燈 ,以及 ESP-01 + DHT11 + LED 傳輸給伺服器端,並於伺服器上 WebSite 透過ESP-01上傳儲 存於 MYSQL 資料呈現曲線圖給前端使用者。此外,前端使用者
使用網路上找來的原碼 測試圖片 因版本問題會出現 error pytesseract.pytesseract.TesseractNotFoundError: C:\Program Files (x86)\Tesseract-OCR esseract.exe is not installed or i
Haar Cascade classifier OpenCV 官方 Github:https://github.com/opencv/opencv/tree/4.x/data 人臉特徵模型:haarcascade_frontalface_default.xml 資料來源: https://steam
詳細原碼: https://reurl.cc/ex8lZm hello world Variable (變數) 輸入 input() 四則運算 列表 list (陣列) 集合 字典(Dictionary) 給值 try 檢驗 取所有值 判斷式 If else 迴圈 Switch //字典方式 CSV
取得掌紋 圖片比對 後續思維... 透過特徵比對+CNN,以YOLO 或 TensorFlow+Keras進行會比較正確。 單靠OpneCV至此是極限,要判斷出各條線,沒模型,則要以numpy陣列加上相似度(哈希算法等)去做,整體上不好進行... 待續...
本專題為兩塊ESP8266-ESP01 ,分別為 Arduino+ESP-01+YL-69 土壤濕度檢測器與LED燈 ,以及 ESP-01 + DHT11 + LED 傳輸給伺服器端,並於伺服器上 WebSite 透過ESP-01上傳儲 存於 MYSQL 資料呈現曲線圖給前端使用者。此外,前端使用者
本專題為兩塊ESP8266-ESP01 ,分別為 Arduino+ESP-01+YL-69 土壤濕度檢測器與LED燈 ,以及 ESP-01 + DHT11 + LED 傳輸給伺服器端,並於伺服器上 WebSite 透過ESP-01上傳儲 存於 MYSQL 資料呈現曲線圖給前端使用者。此外,前端使用者
使用網路上找來的原碼 測試圖片 因版本問題會出現 error pytesseract.pytesseract.TesseractNotFoundError: C:\Program Files (x86)\Tesseract-OCR esseract.exe is not installed or i
Haar Cascade classifier OpenCV 官方 Github:https://github.com/opencv/opencv/tree/4.x/data 人臉特徵模型:haarcascade_frontalface_default.xml 資料來源: https://steam
詳細原碼: https://reurl.cc/ex8lZm hello world Variable (變數) 輸入 input() 四則運算 列表 list (陣列) 集合 字典(Dictionary) 給值 try 檢驗 取所有值 判斷式 If else 迴圈 Switch //字典方式 CSV
取得掌紋 圖片比對 後續思維... 透過特徵比對+CNN,以YOLO 或 TensorFlow+Keras進行會比較正確。 單靠OpneCV至此是極限,要判斷出各條線,沒模型,則要以numpy陣列加上相似度(哈希算法等)去做,整體上不好進行... 待續...
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
如果你不擅長直接編寫原始碼的話,要製作網頁、電子報,一定會非常辛苦,本文介紹的開源網頁神器 GrapesJS 絕對是你在找的工具,強大又免費的特性,可以用 Chrome App 的方式安裝,其它編輯器比起來又簡單很多;還有自訂原始碼……
Thumbnail
EasyOCR是一個能夠幫助你對圖片中的文字進行辨識的工具,透過進階分析,可以應用在文件掃描、自動化數據輸入、發票掃描等領域。本章節將介紹如何安裝、引用模型、進行文字辨識、以及辨識結果的分析。透過學習,你可以建立屬於自己的文字辨識系統。
Thumbnail
FENDI為2024高級訂服製建構出人類的「未來主義」。 全新「Scatola」(「盒子」之意)廓形開頭到收尾,流動精準的幾何打版工藝創造出嶄新量體:高撚雙紗真絲卻描述了輕盈硬挺的效果。 Super Kid Mohair 幼馬海毛布料、上等羊絨和小羊駝紗線的羅紋針織一吋一釐貼
Thumbnail
扭曲變形或 P 圖的照片看鬼有差嗎? . 網友問的。 . 請參照下圖原圖和扭曲的圖片, 網友問這樣的兩張圖片讓我看鬼的話, 會有差嗎? 普通看不到的人可能以為沒差, 但答案其實是很可能會有差, 假設鬼是在很接近兔兔身邊的話啦, 那鬼的樣子就會 [ 連帶被扭曲變形 ], 所以呢,如果你拍照的時候, 使
Thumbnail
股價大漲或大跌確實可能隱含著未來前景變化的徵兆,一般人常以技術分析的觀點看待股價,把長紅突破或長黑破底都視為重要的訊號,但實際有時候只是不具意義的短線波動,只是一種雜訊,是市場的噪音。
Thumbnail
跌勢的止跌現象之一是原本弱勢、主跌的類股必須止跌,例如貨櫃航運、半導體等如果不再破底就能止跌,另一個現象是必須有某一種或幾種類股相對強勢領漲,如果盤面能出現越多有助於止跌的跡象越能真正展開反彈
Thumbnail
道理我都懂,但要怎麼做?要怎麼找到問題?這本書最有價值的部分就在這了。作者穿插了許多案例故事在每個步驟,讓人可以跟著案例內心故事一起爬梳情緒重設的過程,從中也許能發現自己過往沒有察覺的盲點,辨識並調整自己的認知。
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
如果你不擅長直接編寫原始碼的話,要製作網頁、電子報,一定會非常辛苦,本文介紹的開源網頁神器 GrapesJS 絕對是你在找的工具,強大又免費的特性,可以用 Chrome App 的方式安裝,其它編輯器比起來又簡單很多;還有自訂原始碼……
Thumbnail
EasyOCR是一個能夠幫助你對圖片中的文字進行辨識的工具,透過進階分析,可以應用在文件掃描、自動化數據輸入、發票掃描等領域。本章節將介紹如何安裝、引用模型、進行文字辨識、以及辨識結果的分析。透過學習,你可以建立屬於自己的文字辨識系統。
Thumbnail
FENDI為2024高級訂服製建構出人類的「未來主義」。 全新「Scatola」(「盒子」之意)廓形開頭到收尾,流動精準的幾何打版工藝創造出嶄新量體:高撚雙紗真絲卻描述了輕盈硬挺的效果。 Super Kid Mohair 幼馬海毛布料、上等羊絨和小羊駝紗線的羅紋針織一吋一釐貼
Thumbnail
扭曲變形或 P 圖的照片看鬼有差嗎? . 網友問的。 . 請參照下圖原圖和扭曲的圖片, 網友問這樣的兩張圖片讓我看鬼的話, 會有差嗎? 普通看不到的人可能以為沒差, 但答案其實是很可能會有差, 假設鬼是在很接近兔兔身邊的話啦, 那鬼的樣子就會 [ 連帶被扭曲變形 ], 所以呢,如果你拍照的時候, 使
Thumbnail
股價大漲或大跌確實可能隱含著未來前景變化的徵兆,一般人常以技術分析的觀點看待股價,把長紅突破或長黑破底都視為重要的訊號,但實際有時候只是不具意義的短線波動,只是一種雜訊,是市場的噪音。
Thumbnail
跌勢的止跌現象之一是原本弱勢、主跌的類股必須止跌,例如貨櫃航運、半導體等如果不再破底就能止跌,另一個現象是必須有某一種或幾種類股相對強勢領漲,如果盤面能出現越多有助於止跌的跡象越能真正展開反彈
Thumbnail
道理我都懂,但要怎麼做?要怎麼找到問題?這本書最有價值的部分就在這了。作者穿插了許多案例故事在每個步驟,讓人可以跟著案例內心故事一起爬梳情緒重設的過程,從中也許能發現自己過往沒有察覺的盲點,辨識並調整自己的認知。