Forgets commited on
Commit
05b0eb3
·
verified ·
1 Parent(s): 1e09fa7

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +22 -47
app.py CHANGED
@@ -1,66 +1,41 @@
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("/")
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)
 
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)