Spaces:
Sleeping
Sleeping
adding qr code scann -- before was working
Browse files
app.py
CHANGED
@@ -11,6 +11,7 @@ import pandas as pd
|
|
11 |
import io
|
12 |
import re
|
13 |
import traceback
|
|
|
14 |
|
15 |
# Configure logging
|
16 |
logging.basicConfig(level=logging.INFO)
|
@@ -29,14 +30,59 @@ except Exception as e:
|
|
29 |
|
30 |
# Get a random color (used for drawing bounding boxes, if needed)
|
31 |
def get_random_color():
|
32 |
-
return tuple(np.random.randint(0, 256, 3).tolist())
|
33 |
-
|
34 |
def scan_qr_code(image):
|
|
|
|
|
|
|
|
|
|
|
|
|
35 |
try:
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
40 |
except Exception as e:
|
41 |
logger.error(f"QR scan failed: {str(e)}")
|
42 |
return None
|
@@ -83,8 +129,8 @@ def inference(img: Image.Image, confidence):
|
|
83 |
ocr_text = " ".join(ocr_texts)
|
84 |
|
85 |
labels = ["person name", "company name", "job title",
|
86 |
-
|
87 |
-
|
88 |
entities = gliner_model.predict_entities(ocr_text, labels, threshold=confidence, flat_ner=True)
|
89 |
|
90 |
results = {
|
@@ -162,11 +208,11 @@ def inference(img: Image.Image, confidence):
|
|
162 |
results["Person Name"].append(text)
|
163 |
break
|
164 |
|
165 |
-
# QR Code
|
166 |
if (qr_data := scan_qr_code(img)):
|
167 |
results["QR Code"].append(qr_data)
|
168 |
|
169 |
-
# Create CSV
|
170 |
csv_data = {k: "; ".join(v) for k, v in results.items() if v}
|
171 |
with tempfile.NamedTemporaryFile(suffix=".csv", delete=False, mode="w") as tmp_file:
|
172 |
pd.DataFrame([csv_data]).to_csv(tmp_file, index=False)
|
@@ -195,4 +241,4 @@ if __name__ == '__main__':
|
|
195 |
description=description,
|
196 |
css=".gr-interface {max-width: 800px !important;}"
|
197 |
)
|
198 |
-
demo.launch()
|
|
|
11 |
import io
|
12 |
import re
|
13 |
import traceback
|
14 |
+
import zxingcpp # Added zxingcpp for QR decoding
|
15 |
|
16 |
# Configure logging
|
17 |
logging.basicConfig(level=logging.INFO)
|
|
|
30 |
|
31 |
# Get a random color (used for drawing bounding boxes, if needed)
|
32 |
def get_random_color():
|
33 |
+
return tuple(np.random.randint(0, 256, 3).tolist())
|
34 |
+
|
35 |
def scan_qr_code(image):
|
36 |
+
"""
|
37 |
+
Attempts to scan a QR code from the given PIL image using zxingcpp.
|
38 |
+
The image is first saved to a temporary file to be read by zxingcpp.
|
39 |
+
If the direct decoding fails, the function tries a fallback
|
40 |
+
where the image is converted based on a default QR color (black) and tolerance.
|
41 |
+
"""
|
42 |
try:
|
43 |
+
# Save the PIL image to a temporary file
|
44 |
+
with tempfile.NamedTemporaryFile(suffix=".png", delete=False) as tmp:
|
45 |
+
image.save(tmp, format="PNG")
|
46 |
+
tmp_path = tmp.name
|
47 |
+
|
48 |
+
# Convert the saved image to a CV2 image
|
49 |
+
img_cv = cv2.imread(tmp_path)
|
50 |
+
# First attempt: direct decoding with zxingcpp
|
51 |
+
try:
|
52 |
+
results = zxingcpp.read_barcodes(img_cv)
|
53 |
+
if results and results[0].text:
|
54 |
+
return results[0].text.strip()
|
55 |
+
except Exception as e:
|
56 |
+
logger.warning(f"Direct zxingcpp decoding failed: {e}")
|
57 |
+
|
58 |
+
# Fallback: Process image by converting specific QR colors with default parameters.
|
59 |
+
default_color = "#000000" # Default QR color assumed (black)
|
60 |
+
tolerance = 50 # Fixed tolerance value
|
61 |
+
qr_img = image.convert("RGB")
|
62 |
+
datas = list(qr_img.getdata())
|
63 |
+
newData = []
|
64 |
+
# Convert hex default color to an RGB tuple
|
65 |
+
h1 = default_color.strip("#")
|
66 |
+
rgb_tup = tuple(int(h1[i:i+2], 16) for i in (0, 2, 4))
|
67 |
+
for item in datas:
|
68 |
+
# Check if the pixel is within the tolerance of the default color
|
69 |
+
if (item[0] in range(rgb_tup[0]-tolerance, rgb_tup[0]+tolerance) and
|
70 |
+
item[1] in range(rgb_tup[1]-tolerance, rgb_tup[1]+tolerance) and
|
71 |
+
item[2] in range(rgb_tup[2]-tolerance, rgb_tup[2]+tolerance)):
|
72 |
+
newData.append((0, 0, 0))
|
73 |
+
else:
|
74 |
+
newData.append((255, 255, 255))
|
75 |
+
qr_img.putdata(newData)
|
76 |
+
fallback_path = tmp_path + "_converted.png"
|
77 |
+
qr_img.save(fallback_path)
|
78 |
+
img_cv = cv2.imread(fallback_path)
|
79 |
+
try:
|
80 |
+
results = zxingcpp.read_barcodes(img_cv)
|
81 |
+
if results and results[0].text:
|
82 |
+
return results[0].text.strip()
|
83 |
+
except Exception as e:
|
84 |
+
logger.error(f"Fallback decoding failed: {e}")
|
85 |
+
return None
|
86 |
except Exception as e:
|
87 |
logger.error(f"QR scan failed: {str(e)}")
|
88 |
return None
|
|
|
129 |
ocr_text = " ".join(ocr_texts)
|
130 |
|
131 |
labels = ["person name", "company name", "job title",
|
132 |
+
"phone number", "email address", "address",
|
133 |
+
"website"]
|
134 |
entities = gliner_model.predict_entities(ocr_text, labels, threshold=confidence, flat_ner=True)
|
135 |
|
136 |
results = {
|
|
|
208 |
results["Person Name"].append(text)
|
209 |
break
|
210 |
|
211 |
+
# QR Code scanning using the new zxingcpp-based function
|
212 |
if (qr_data := scan_qr_code(img)):
|
213 |
results["QR Code"].append(qr_data)
|
214 |
|
215 |
+
# Create CSV file containing the results
|
216 |
csv_data = {k: "; ".join(v) for k, v in results.items() if v}
|
217 |
with tempfile.NamedTemporaryFile(suffix=".csv", delete=False, mode="w") as tmp_file:
|
218 |
pd.DataFrame([csv_data]).to_csv(tmp_file, index=False)
|
|
|
241 |
description=description,
|
242 |
css=".gr-interface {max-width: 800px !important;}"
|
243 |
)
|
244 |
+
demo.launch()
|