Forgets commited on
Commit
d98a53a
·
verified ·
1 Parent(s): fac789f

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +47 -22
app.py CHANGED
@@ -1,41 +1,66 @@
1
- from fastapi import FastAPI, UploadFile, File
2
  import cv2
3
  import numpy as np
4
  import uvicorn
5
- from io import BytesIO
6
- from PIL import Image
 
7
 
8
  app = FastAPI()
9
 
10
- def find_diff(bg_img, target_img):
11
- # Robah ka grayscale
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12
  bg_gray = cv2.cvtColor(bg_img, cv2.COLOR_BGR2GRAY)
13
  target_gray = cv2.cvtColor(target_img, cv2.COLOR_BGR2GRAY)
14
 
15
- # Template Matching
16
- res = cv2.matchTemplate(bg_gray, target_gray, cv2.TM_CCOEFF_NORMED)
 
 
 
 
 
17
  _, _, _, max_loc = cv2.minMaxLoc(res)
18
 
19
- # max_loc[0] nyaeta koordinat X (jarak geser)
20
- return max_loc[0]
21
 
22
  @app.post("/solve")
23
- async def solve(background: UploadFile = File(...), target: UploadFile = File(...)):
24
  try:
25
- # Baca gambar background
26
- bg_bytes = await background.read()
27
- bg_img = cv2.imdecode(np.frombuffer(bg_bytes, np.uint8), cv2.IMREAD_COLOR)
 
28
 
29
- # Baca gambar target (potongan puzzle)
30
- target_bytes = await target.read()
31
- target_img = cv2.imdecode(np.frombuffer(target_bytes, np.uint8), cv2.IMREAD_COLOR)
32
-
33
- # Cari jarak
34
- distance = find_diff(bg_img, target_img)
35
-
36
- return {"status": "success", "distance": int(distance)}
37
  except Exception as e:
38
  return {"status": "error", "message": str(e)}
39
 
 
 
 
 
40
  if __name__ == "__main__":
41
- uvicorn.run(app, host="0.0.0.0", port=7860)
 
 
1
+ from fastapi import FastAPI, HTTPException
2
  import cv2
3
  import numpy as np
4
  import uvicorn
5
+ import base64
6
+ import re
7
+ from pydantic import BaseModel
8
 
9
  app = FastAPI()
10
 
11
+ # Model untuk menerima data Base64 dari PHP
12
+ class CaptchaData(BaseModel):
13
+ background: str
14
+ target: str
15
+
16
+ def solve_distance(bg_b64, target_b64):
17
+ """
18
+ Logika AI untuk menghitung jarak geser dengan Canny Edge Detection
19
+ Sesuai dengan kebutuhan slide puzzle di rs.js
20
+ """
21
+ # 1. Decode Base64 ke OpenCV format
22
+ bg_bytes = base64.b64decode(re.sub(r'^data:image/\w+;base64,', '', bg_b64))
23
+ target_bytes = base64.b64decode(re.sub(r'^data:image/\w+;base64,', '', target_b64))
24
+
25
+ bg_img = cv2.imdecode(np.frombuffer(bg_bytes, np.uint8), cv2.IMREAD_COLOR)
26
+ target_img = cv2.imdecode(np.frombuffer(target_bytes, np.uint8), cv2.IMREAD_COLOR)
27
+
28
+ # 2. Preprocessing ke Grayscale
29
  bg_gray = cv2.cvtColor(bg_img, cv2.COLOR_BGR2GRAY)
30
  target_gray = cv2.cvtColor(target_img, cv2.COLOR_BGR2GRAY)
31
 
32
+ # 3. Canny Edge Detection (Sangat krusial untuk memisahkan bentuk puzzle)
33
+ # Ini membantu mengabaikan perbedaan warna/noise di background
34
+ bg_edge = cv2.Canny(bg_gray, 100, 200)
35
+ target_edge = cv2.Canny(target_gray, 100, 200)
36
+
37
+ # 4. Template Matching menggunakan hasil Edges
38
+ res = cv2.matchTemplate(bg_edge, target_edge, cv2.TM_CCOEFF_NORMED)
39
  _, _, _, max_loc = cv2.minMaxLoc(res)
40
 
41
+ # max_loc[0] adalah koordinat X (jarak geser horizontal)
42
+ return float(max_loc[0])
43
 
44
  @app.post("/solve")
45
+ async def solve(data: CaptchaData):
46
  try:
47
+ if not data.background or not data.target:
48
+ raise HTTPException(status_code=400, detail="Data gambar tidak lengkap")
49
+
50
+ distance = solve_distance(data.background, data.target)
51
 
52
+ return {
53
+ "status": "success",
54
+ "distance": int(distance),
55
+ "method": "canny_edge_matching"
56
+ }
 
 
 
57
  except Exception as e:
58
  return {"status": "error", "message": str(e)}
59
 
60
+ @app.get("/forget")
61
+ async def health_check():
62
+ return {"status": "online", "description": "RSCaptcha AI Solver"}
63
+
64
  if __name__ == "__main__":
65
+ # Port 7860 adalah default untuk Hugging Face Spaces
66
+ uvicorn.run(app, host="0.0.0.0", port=7860)