Spaces:
Running
Running
File size: 7,531 Bytes
d7f61be 497f61b |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 |
import sys
sys.path.append('.')
import os
import base64
import json
from ctypes import *
import cv2
import numpy as np
from flask import Flask, request, jsonify
from veinsdk import *
from roi import *
licensePath = "license.txt"
license = ""
machineCode = getMachineCode()
print("\nmachineCode: ", machineCode.decode('utf-8'))
# Get a specific environment variable by name
license = os.environ.get("LICENSE")
# Check if the variable exists
if license is not None:
print("Value of LICENSE:")
else:
license = ""
try:
with open(licensePath, 'r') as file:
license = file.read().strip()
except IOError as exc:
print("failed to open license.txt: ", exc.errno)
print("license: ", license)
ret = setActivation(license.encode('utf-8'))
print("\nactivation: ", ret)
ret = initSDK()
print("init: ", ret)
app = Flask(__name__)
def mat_to_bytes(mat):
"""
Convert cv::Mat image data (NumPy array in Python) to raw bytes.
"""
# Encode cv::Mat as PNG bytes
is_success, buffer = cv2.imencode(".png", mat)
if not is_success:
raise ValueError("Failed to encode cv::Mat image")
return buffer.tobytes()
@app.route('/palmvein', methods=['POST'])
def palmvein():
result = None
score = None
file1 = request.files['file1']
file2 = request.files['file2']
try:
image1 = cv2.imdecode(np.frombuffer(file1.read(), np.uint8), cv2.IMREAD_COLOR)
except:
result = "Failed to open file1"
response = jsonify({"result": result, "score": float(score)})
response.status_code = 200
response.headers["Content-Type"] = "application/json; charset=utf-8"
return response
try:
image2 = cv2.imdecode(np.frombuffer(file2.read(), np.uint8), cv2.IMREAD_COLOR)
except:
result = "Failed to open file2"
response = jsonify({"result": result, "score": float(score)})
response.status_code = 200
response.headers["Content-Type"] = "application/json; charset=utf-8"
return response
roi1, label1 = get_roi_image(cv2.flip(image1, 1))
roi2, label2 = get_roi_image(cv2.flip(image2, 1))
if label1 != label2:
result = "2 images are from the different hand"
score = 0.0
response = jsonify({"result": result, "score": float(score)})
response.status_code = 200
response.headers["Content-Type"] = "application/json; charset=utf-8"
return response
if roi1 is None or roi2 is None:
result = "\n hand detection failed !\n plesae make sure that input hand image is valid or not."
response = jsonify({"result": result, "score": float(score)})
response.status_code = 200
response.headers["Content-Type"] = "application/json; charset=utf-8"
return response
roi_byte1 = mat_to_bytes(roi1)
roi_byte2 = mat_to_bytes(roi2)
feature_array1, feature_array2 = (c_float * 1024)(), (c_float * 1024)() # Assuming a maximum of 256 rectangles
cnt1 = getFeature(roi_byte1, len(roi_byte1), feature_array1)
cnt2 = getFeature(roi_byte2, len(roi_byte2), feature_array2)
if cnt1 == 0 or cnt2 ==0:
result = "feature extraction failed !"
response = jsonify({"result": result, "score": float(score)})
response.status_code = 200
response.headers["Content-Type"] = "application/json; charset=utf-8"
return response
score = getScore(feature_array1, cnt1, feature_array2, cnt2)
if score >= 0.65:
result = "Same Hand !"
# print(f"\n 2 images are from the same hand\n similarity: {score}")
response = jsonify({"result": result, "score": float(score)})
response.status_code = 200
response.headers["Content-Type"] = "application/json; charset=utf-8"
return response
else:
result = "Different Hand !"
# print(f"\n 2 images are from the different hand\n similarity: {score}")
response = jsonify({"result": result, "score": float(score)})
response.status_code = 200
response.headers["Content-Type"] = "application/json; charset=utf-8"
return response
@app.route('/palmvein_base64', methods=['POST'])
def palmvein_base64():
result = None
score = None
content = request.get_json()
try:
imageBase64 = content['base64_1']
image_data = base64.b64decode(imageBase64)
np_array = np.frombuffer(image_data, np.uint8)
image1 = cv2.imdecode(np_array, cv2.IMREAD_COLOR)
except:
result = "Failed to open file1"
response = jsonify({"result": result, "score": float(score)})
response.status_code = 200
response.headers["Content-Type"] = "application/json; charset=utf-8"
return response
try:
imageBase64 = content['base64_2']
image_data = base64.b64decode(imageBase64)
np_array = np.frombuffer(image_data, np.uint8)
image2 = cv2.imdecode(np_array, cv2.IMREAD_COLOR)
except:
result = "Failed to open file2"
response = jsonify({"result": result, "score": float(score)})
response.status_code = 200
response.headers["Content-Type"] = "application/json; charset=utf-8"
return response
roi1, label1 = get_roi_image(cv2.flip(image1, 1))
roi2, label2 = get_roi_image(cv2.flip(image2, 1))
if label1 != label2:
result = "2 images are from the different hand"
score = 0.0
response = jsonify({"result": result, "score": float(score)})
response.status_code = 200
response.headers["Content-Type"] = "application/json; charset=utf-8"
return response
if roi1 is None or roi2 is None:
result = "\n hand detection failed !\n plesae make sure that input hand image is valid or not."
response = jsonify({"result": result, "score": float(score)})
response.status_code = 200
response.headers["Content-Type"] = "application/json; charset=utf-8"
return response
roi_byte1 = mat_to_bytes(roi1)
roi_byte2 = mat_to_bytes(roi2)
feature_array1, feature_array2 = (c_float * 1024)(), (c_float * 1024)() # Assuming a maximum of 256 rectangles
cnt1 = getFeature(roi_byte1, len(roi_byte1), feature_array1)
cnt2 = getFeature(roi_byte2, len(roi_byte2), feature_array2)
if cnt1 == 0 or cnt2 ==0:
result = "feature extraction failed !"
response = jsonify({"result": result, "score": float(score)})
response.status_code = 200
response.headers["Content-Type"] = "application/json; charset=utf-8"
return response
score = getScore(feature_array1, cnt1, feature_array2, cnt2)
if score >= 0.65:
result = "Same Hand !"
# print(f"\n 2 images are from the same hand\n similarity: {score}")
response = jsonify({"result": result, "score": float(score)})
response.status_code = 200
response.headers["Content-Type"] = "application/json; charset=utf-8"
return response
else:
result = "Different Hand !"
# print(f"\n 2 images are from the different hand\n similarity: {score}")
response = jsonify({"result": result, "score": float(score)})
response.status_code = 200
response.headers["Content-Type"] = "application/json; charset=utf-8"
return response
if __name__ == '__main__':
port = int(os.environ.get("PORT", 8080))
app.run(host='0.0.0.0', port=port) |