diff --git a/0.png b/0.png deleted file mode 100644 index 27c4cef..0000000 Binary files a/0.png and /dev/null differ diff --git a/test_data/0.png b/DataSet/0.png similarity index 100% rename from test_data/0.png rename to DataSet/0.png diff --git a/test_data/1.png b/DataSet/1.png similarity index 100% rename from test_data/1.png rename to DataSet/1.png diff --git a/test_data/10.png b/DataSet/10.png similarity index 100% rename from test_data/10.png rename to DataSet/10.png diff --git a/test_data/100.png b/DataSet/100.png similarity index 100% rename from test_data/100.png rename to DataSet/100.png diff --git a/test_data/101.png b/DataSet/101.png similarity index 100% rename from test_data/101.png rename to DataSet/101.png diff --git a/test_data/102.png b/DataSet/102.png similarity index 100% rename from test_data/102.png rename to DataSet/102.png diff --git a/test_data/103.png b/DataSet/103.png similarity index 100% rename from test_data/103.png rename to DataSet/103.png diff --git a/test_data/104.png b/DataSet/104.png similarity index 100% rename from test_data/104.png rename to DataSet/104.png diff --git a/test_data/105.png b/DataSet/105.png similarity index 100% rename from test_data/105.png rename to DataSet/105.png diff --git a/test_data/106.png b/DataSet/106.png similarity index 100% rename from test_data/106.png rename to DataSet/106.png diff --git a/test_data/107.png b/DataSet/107.png similarity index 100% rename from test_data/107.png rename to DataSet/107.png diff --git a/test_data/108.png b/DataSet/108.png similarity index 100% rename from test_data/108.png rename to DataSet/108.png diff --git a/test_data/109.png b/DataSet/109.png similarity index 100% rename from test_data/109.png rename to DataSet/109.png diff --git a/test_data/11.png b/DataSet/11.png similarity index 100% rename from test_data/11.png rename to DataSet/11.png diff --git a/test_data/110.png b/DataSet/110.png similarity index 100% rename from test_data/110.png rename to DataSet/110.png diff --git a/test_data/111.png b/DataSet/111.png similarity index 100% rename from test_data/111.png rename to DataSet/111.png diff --git a/test_data/112.png b/DataSet/112.png similarity index 100% rename from test_data/112.png rename to DataSet/112.png diff --git a/test_data/113.png b/DataSet/113.png similarity index 100% rename from test_data/113.png rename to DataSet/113.png diff --git a/test_data/114.png b/DataSet/114.png similarity index 100% rename from test_data/114.png rename to DataSet/114.png diff --git a/test_data/115.png b/DataSet/115.png similarity index 100% rename from test_data/115.png rename to DataSet/115.png diff --git a/test_data/116.png b/DataSet/116.png similarity index 100% rename from test_data/116.png rename to DataSet/116.png diff --git a/test_data/117.png b/DataSet/117.png similarity index 100% rename from test_data/117.png rename to DataSet/117.png diff --git a/test_data/118.png b/DataSet/118.png similarity index 100% rename from test_data/118.png rename to DataSet/118.png diff --git a/test_data/119.png b/DataSet/119.png similarity index 100% rename from test_data/119.png rename to DataSet/119.png diff --git a/test_data/12.png b/DataSet/12.png similarity index 100% rename from test_data/12.png rename to DataSet/12.png diff --git a/test_data/120.png b/DataSet/120.png similarity index 100% rename from test_data/120.png rename to DataSet/120.png diff --git a/test_data/121.png b/DataSet/121.png similarity index 100% rename from test_data/121.png rename to DataSet/121.png diff --git a/test_data/122.png b/DataSet/122.png similarity index 100% rename from test_data/122.png rename to DataSet/122.png diff --git a/test_data/123.png b/DataSet/123.png similarity index 100% rename from test_data/123.png rename to DataSet/123.png diff --git a/test_data/124.png b/DataSet/124.png similarity index 100% rename from test_data/124.png rename to DataSet/124.png diff --git a/test_data/125.png b/DataSet/125.png similarity index 100% rename from test_data/125.png rename to DataSet/125.png diff --git a/test_data/126.png b/DataSet/126.png similarity index 100% rename from test_data/126.png rename to DataSet/126.png diff --git a/test_data/127.png b/DataSet/127.png similarity index 100% rename from test_data/127.png rename to DataSet/127.png diff --git a/test_data/128.png b/DataSet/128.png similarity index 100% rename from test_data/128.png rename to DataSet/128.png diff --git a/test_data/129.png b/DataSet/129.png similarity index 100% rename from test_data/129.png rename to DataSet/129.png diff --git a/test_data/13.png b/DataSet/13.png similarity index 100% rename from test_data/13.png rename to DataSet/13.png diff --git a/test_data/130.png b/DataSet/130.png similarity index 100% rename from test_data/130.png rename to DataSet/130.png diff --git a/test_data/131.png b/DataSet/131.png similarity index 100% rename from test_data/131.png rename to DataSet/131.png diff --git a/test_data/132.png b/DataSet/132.png similarity index 100% rename from test_data/132.png rename to DataSet/132.png diff --git a/test_data/133.png b/DataSet/133.png similarity index 100% rename from test_data/133.png rename to DataSet/133.png diff --git a/test_data/134.png b/DataSet/134.png similarity index 100% rename from test_data/134.png rename to DataSet/134.png diff --git a/test_data/135.png b/DataSet/135.png similarity index 100% rename from test_data/135.png rename to DataSet/135.png diff --git a/test_data/136.png b/DataSet/136.png similarity index 100% rename from test_data/136.png rename to DataSet/136.png diff --git a/test_data/137.png b/DataSet/137.png similarity index 100% rename from test_data/137.png rename to DataSet/137.png diff --git a/test_data/138.png b/DataSet/138.png similarity index 100% rename from test_data/138.png rename to DataSet/138.png diff --git a/test_data/139.png b/DataSet/139.png similarity index 100% rename from test_data/139.png rename to DataSet/139.png diff --git a/test_data/14.png b/DataSet/14.png similarity index 100% rename from test_data/14.png rename to DataSet/14.png diff --git a/test_data/140.png b/DataSet/140.png similarity index 100% rename from test_data/140.png rename to DataSet/140.png diff --git a/test_data/15.png b/DataSet/15.png similarity index 100% rename from test_data/15.png rename to DataSet/15.png diff --git a/test_data/16.png b/DataSet/16.png similarity index 100% rename from test_data/16.png rename to DataSet/16.png diff --git a/test_data/17.png b/DataSet/17.png similarity index 100% rename from test_data/17.png rename to DataSet/17.png diff --git a/test_data/18.png b/DataSet/18.png similarity index 100% rename from test_data/18.png rename to DataSet/18.png diff --git a/test_data/19.png b/DataSet/19.png similarity index 100% rename from test_data/19.png rename to DataSet/19.png diff --git a/test_data/2.png b/DataSet/2.png similarity index 100% rename from test_data/2.png rename to DataSet/2.png diff --git a/test_data/20.png b/DataSet/20.png similarity index 100% rename from test_data/20.png rename to DataSet/20.png diff --git a/test_data/21.png b/DataSet/21.png similarity index 100% rename from test_data/21.png rename to DataSet/21.png diff --git a/test_data/22.png b/DataSet/22.png similarity index 100% rename from test_data/22.png rename to DataSet/22.png diff --git a/test_data/23.png b/DataSet/23.png similarity index 100% rename from test_data/23.png rename to DataSet/23.png diff --git a/test_data/24.png b/DataSet/24.png similarity index 100% rename from test_data/24.png rename to DataSet/24.png diff --git a/test_data/25.png b/DataSet/25.png similarity index 100% rename from test_data/25.png rename to DataSet/25.png diff --git a/test_data/26.png b/DataSet/26.png similarity index 100% rename from test_data/26.png rename to DataSet/26.png diff --git a/test_data/27.png b/DataSet/27.png similarity index 100% rename from test_data/27.png rename to DataSet/27.png diff --git a/test_data/28.png b/DataSet/28.png similarity index 100% rename from test_data/28.png rename to DataSet/28.png diff --git a/test_data/29.png b/DataSet/29.png similarity index 100% rename from test_data/29.png rename to DataSet/29.png diff --git a/test_data/3.png b/DataSet/3.png similarity index 100% rename from test_data/3.png rename to DataSet/3.png diff --git a/test_data/30.png b/DataSet/30.png similarity index 100% rename from test_data/30.png rename to DataSet/30.png diff --git a/test_data/31.png b/DataSet/31.png similarity index 100% rename from test_data/31.png rename to DataSet/31.png diff --git a/test_data/32.png b/DataSet/32.png similarity index 100% rename from test_data/32.png rename to DataSet/32.png diff --git a/test_data/33.png b/DataSet/33.png similarity index 100% rename from test_data/33.png rename to DataSet/33.png diff --git a/test_data/34.png b/DataSet/34.png similarity index 100% rename from test_data/34.png rename to DataSet/34.png diff --git a/test_data/35.png b/DataSet/35.png similarity index 100% rename from test_data/35.png rename to DataSet/35.png diff --git a/test_data/36.png b/DataSet/36.png similarity index 100% rename from test_data/36.png rename to DataSet/36.png diff --git a/test_data/37.png b/DataSet/37.png similarity index 100% rename from test_data/37.png rename to DataSet/37.png diff --git a/test_data/38.png b/DataSet/38.png similarity index 100% rename from test_data/38.png rename to DataSet/38.png diff --git a/test_data/39.png b/DataSet/39.png similarity index 100% rename from test_data/39.png rename to DataSet/39.png diff --git a/test_data/4.png b/DataSet/4.png similarity index 100% rename from test_data/4.png rename to DataSet/4.png diff --git a/test_data/40.png b/DataSet/40.png similarity index 100% rename from test_data/40.png rename to DataSet/40.png diff --git a/test_data/41.png b/DataSet/41.png similarity index 100% rename from test_data/41.png rename to DataSet/41.png diff --git a/test_data/42.png b/DataSet/42.png similarity index 100% rename from test_data/42.png rename to DataSet/42.png diff --git a/test_data/43.png b/DataSet/43.png similarity index 100% rename from test_data/43.png rename to DataSet/43.png diff --git a/test_data/44.png b/DataSet/44.png similarity index 100% rename from test_data/44.png rename to DataSet/44.png diff --git a/test_data/45.png b/DataSet/45.png similarity index 100% rename from test_data/45.png rename to DataSet/45.png diff --git a/test_data/46.png b/DataSet/46.png similarity index 100% rename from test_data/46.png rename to DataSet/46.png diff --git a/test_data/47.png b/DataSet/47.png similarity index 100% rename from test_data/47.png rename to DataSet/47.png diff --git a/test_data/48.png b/DataSet/48.png similarity index 100% rename from test_data/48.png rename to DataSet/48.png diff --git a/test_data/49.png b/DataSet/49.png similarity index 100% rename from test_data/49.png rename to DataSet/49.png diff --git a/test_data/5.png b/DataSet/5.png similarity index 100% rename from test_data/5.png rename to DataSet/5.png diff --git a/test_data/50.png b/DataSet/50.png similarity index 100% rename from test_data/50.png rename to DataSet/50.png diff --git a/test_data/51.png b/DataSet/51.png similarity index 100% rename from test_data/51.png rename to DataSet/51.png diff --git a/test_data/52.png b/DataSet/52.png similarity index 100% rename from test_data/52.png rename to DataSet/52.png diff --git a/test_data/53.png b/DataSet/53.png similarity index 100% rename from test_data/53.png rename to DataSet/53.png diff --git a/test_data/54.png b/DataSet/54.png similarity index 100% rename from test_data/54.png rename to DataSet/54.png diff --git a/test_data/55.png b/DataSet/55.png similarity index 100% rename from test_data/55.png rename to DataSet/55.png diff --git a/test_data/56.png b/DataSet/56.png similarity index 100% rename from test_data/56.png rename to DataSet/56.png diff --git a/test_data/57.png b/DataSet/57.png similarity index 100% rename from test_data/57.png rename to DataSet/57.png diff --git a/test_data/58.png b/DataSet/58.png similarity index 100% rename from test_data/58.png rename to DataSet/58.png diff --git a/test_data/59.png b/DataSet/59.png similarity index 100% rename from test_data/59.png rename to DataSet/59.png diff --git a/test_data/6.png b/DataSet/6.png similarity index 100% rename from test_data/6.png rename to DataSet/6.png diff --git a/test_data/60.png b/DataSet/60.png similarity index 100% rename from test_data/60.png rename to DataSet/60.png diff --git a/test_data/61.png b/DataSet/61.png similarity index 100% rename from test_data/61.png rename to DataSet/61.png diff --git a/test_data/62.png b/DataSet/62.png similarity index 100% rename from test_data/62.png rename to DataSet/62.png diff --git a/test_data/63.png b/DataSet/63.png similarity index 100% rename from test_data/63.png rename to DataSet/63.png diff --git a/test_data/64.png b/DataSet/64.png similarity index 100% rename from test_data/64.png rename to DataSet/64.png diff --git a/test_data/65.png b/DataSet/65.png similarity index 100% rename from test_data/65.png rename to DataSet/65.png diff --git a/test_data/66.png b/DataSet/66.png similarity index 100% rename from test_data/66.png rename to DataSet/66.png diff --git a/test_data/67.png b/DataSet/67.png similarity index 100% rename from test_data/67.png rename to DataSet/67.png diff --git a/test_data/68.png b/DataSet/68.png similarity index 100% rename from test_data/68.png rename to DataSet/68.png diff --git a/test_data/69.png b/DataSet/69.png similarity index 100% rename from test_data/69.png rename to DataSet/69.png diff --git a/test_data/7.png b/DataSet/7.png similarity index 100% rename from test_data/7.png rename to DataSet/7.png diff --git a/test_data/70.png b/DataSet/70.png similarity index 100% rename from test_data/70.png rename to DataSet/70.png diff --git a/test_data/71.png b/DataSet/71.png similarity index 100% rename from test_data/71.png rename to DataSet/71.png diff --git a/test_data/72.png b/DataSet/72.png similarity index 100% rename from test_data/72.png rename to DataSet/72.png diff --git a/test_data/73.png b/DataSet/73.png similarity index 100% rename from test_data/73.png rename to DataSet/73.png diff --git a/test_data/74.png b/DataSet/74.png similarity index 100% rename from test_data/74.png rename to DataSet/74.png diff --git a/test_data/75.png b/DataSet/75.png similarity index 100% rename from test_data/75.png rename to DataSet/75.png diff --git a/test_data/76.png b/DataSet/76.png similarity index 100% rename from test_data/76.png rename to DataSet/76.png diff --git a/test_data/77.png b/DataSet/77.png similarity index 100% rename from test_data/77.png rename to DataSet/77.png diff --git a/test_data/78.png b/DataSet/78.png similarity index 100% rename from test_data/78.png rename to DataSet/78.png diff --git a/test_data/79.png b/DataSet/79.png similarity index 100% rename from test_data/79.png rename to DataSet/79.png diff --git a/test_data/8.png b/DataSet/8.png similarity index 100% rename from test_data/8.png rename to DataSet/8.png diff --git a/test_data/80.png b/DataSet/80.png similarity index 100% rename from test_data/80.png rename to DataSet/80.png diff --git a/test_data/81.png b/DataSet/81.png similarity index 100% rename from test_data/81.png rename to DataSet/81.png diff --git a/test_data/82.png b/DataSet/82.png similarity index 100% rename from test_data/82.png rename to DataSet/82.png diff --git a/test_data/83.png b/DataSet/83.png similarity index 100% rename from test_data/83.png rename to DataSet/83.png diff --git a/test_data/84.png b/DataSet/84.png similarity index 100% rename from test_data/84.png rename to DataSet/84.png diff --git a/test_data/85.png b/DataSet/85.png similarity index 100% rename from test_data/85.png rename to DataSet/85.png diff --git a/test_data/86.png b/DataSet/86.png similarity index 100% rename from test_data/86.png rename to DataSet/86.png diff --git a/test_data/87.png b/DataSet/87.png similarity index 100% rename from test_data/87.png rename to DataSet/87.png diff --git a/test_data/88.png b/DataSet/88.png similarity index 100% rename from test_data/88.png rename to DataSet/88.png diff --git a/test_data/89.png b/DataSet/89.png similarity index 100% rename from test_data/89.png rename to DataSet/89.png diff --git a/test_data/9.png b/DataSet/9.png similarity index 100% rename from test_data/9.png rename to DataSet/9.png diff --git a/test_data/90.png b/DataSet/90.png similarity index 100% rename from test_data/90.png rename to DataSet/90.png diff --git a/test_data/91.png b/DataSet/91.png similarity index 100% rename from test_data/91.png rename to DataSet/91.png diff --git a/test_data/92.png b/DataSet/92.png similarity index 100% rename from test_data/92.png rename to DataSet/92.png diff --git a/test_data/93.png b/DataSet/93.png similarity index 100% rename from test_data/93.png rename to DataSet/93.png diff --git a/test_data/94.png b/DataSet/94.png similarity index 100% rename from test_data/94.png rename to DataSet/94.png diff --git a/test_data/95.png b/DataSet/95.png similarity index 100% rename from test_data/95.png rename to DataSet/95.png diff --git a/test_data/96.png b/DataSet/96.png similarity index 100% rename from test_data/96.png rename to DataSet/96.png diff --git a/test_data/97.png b/DataSet/97.png similarity index 100% rename from test_data/97.png rename to DataSet/97.png diff --git a/test_data/98.png b/DataSet/98.png similarity index 100% rename from test_data/98.png rename to DataSet/98.png diff --git a/test_data/99.png b/DataSet/99.png similarity index 100% rename from test_data/99.png rename to DataSet/99.png diff --git a/DataSet/error.png b/DataSet/error.png new file mode 100644 index 0000000..647baa9 Binary files /dev/null and b/DataSet/error.png differ diff --git a/DataSet/error10.png b/DataSet/error10.png new file mode 100644 index 0000000..16be015 Binary files /dev/null and b/DataSet/error10.png differ diff --git a/DataSet/error11.png b/DataSet/error11.png new file mode 100644 index 0000000..7868f74 Binary files /dev/null and b/DataSet/error11.png differ diff --git a/DataSet/error2.png b/DataSet/error2.png new file mode 100644 index 0000000..f21c979 Binary files /dev/null and b/DataSet/error2.png differ diff --git a/DataSet/error3.png b/DataSet/error3.png new file mode 100644 index 0000000..7c00dfe Binary files /dev/null and b/DataSet/error3.png differ diff --git a/DataSet/error5.png b/DataSet/error5.png new file mode 100644 index 0000000..525be11 Binary files /dev/null and b/DataSet/error5.png differ diff --git a/DataSet/error8.png b/DataSet/error8.png new file mode 100644 index 0000000..ac1fa8f Binary files /dev/null and b/DataSet/error8.png differ diff --git a/DataSet/error9.png b/DataSet/error9.png new file mode 100644 index 0000000..01ddef2 Binary files /dev/null and b/DataSet/error9.png differ diff --git a/test_data/ml_soce.py b/DataSet/ml_soce.py similarity index 100% rename from test_data/ml_soce.py rename to DataSet/ml_soce.py diff --git a/test_data/tuning.py b/DataSet/tuning.py similarity index 100% rename from test_data/tuning.py rename to DataSet/tuning.py diff --git a/README.md b/README.md index a32acef..d14e9d4 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ - # JumpMaster +# JumpMaster -来自渣渣视觉小新的小试牛刀,写的不好,见笑了。 -From the slag visual first test knife, writing is not good, laughed. --来自于百度翻译 +main.py 是入口文件 jump.process 是主要的处理文件 +jumpmaster 是主要的类 adb是和安卓手机通信的类 diff --git a/check.py b/check.py deleted file mode 100644 index 9ad856b..0000000 --- a/check.py +++ /dev/null @@ -1,24 +0,0 @@ -import numpy as np -''' -a = np.array([[3,222,555,5555],[1,2,3,4],[7,3,9,5]]) -stop = 0 -for r,i in enumerate(a): - for c,j in enumerate(i): - if j == 5: - print(r,c) - stop = 1 - break - if stop == 1: - break -''' - -a = np.array([1,2,3,4]) - -print(a[::-1]) - - - - - - - \ No newline at end of file diff --git a/check1.py b/check1.py deleted file mode 100644 index f5d3ee3..0000000 --- a/check1.py +++ /dev/null @@ -1,6 +0,0 @@ -import numpy as np -import time - -while True: - time.sleep(1) - print(1) \ No newline at end of file diff --git a/error1.png b/error1.png new file mode 100644 index 0000000..67f3e8c Binary files /dev/null and b/error1.png differ diff --git a/error10.png b/error10.png new file mode 100644 index 0000000..728f2f3 Binary files /dev/null and b/error10.png differ diff --git a/error11.png b/error11.png new file mode 100644 index 0000000..67f3e8c Binary files /dev/null and b/error11.png differ diff --git a/error2.png b/error2.png new file mode 100644 index 0000000..672891f Binary files /dev/null and b/error2.png differ diff --git a/error8.png b/error8.png new file mode 100644 index 0000000..16be015 Binary files /dev/null and b/error8.png differ diff --git a/jump/__pycache__/__init__.cpython-36.pyc b/jump/__pycache__/__init__.cpython-36.pyc index 310ac89..b49c975 100644 Binary files a/jump/__pycache__/__init__.cpython-36.pyc and b/jump/__pycache__/__init__.cpython-36.pyc differ diff --git a/jump/__pycache__/adb.cpython-36.pyc b/jump/__pycache__/adb.cpython-36.pyc index dad5fb6..4baeacf 100644 Binary files a/jump/__pycache__/adb.cpython-36.pyc and b/jump/__pycache__/adb.cpython-36.pyc differ diff --git a/jump/__pycache__/process.cpython-36.pyc b/jump/__pycache__/process.cpython-36.pyc index 3808a04..fbf2548 100644 Binary files a/jump/__pycache__/process.cpython-36.pyc and b/jump/__pycache__/process.cpython-36.pyc differ diff --git a/jump/adb.py b/jump/adb.py index 295427a..81a2faa 100644 --- a/jump/adb.py +++ b/jump/adb.py @@ -17,7 +17,8 @@ def __init__(self): def screenshot(self): ''' get an image from android phone''' sub.call("adb shell screencap -p | sed 's/\r$//' > liang.png",shell = True) - img = cv.imread("liang.png",-1) + img = cv.imread("liang.png",1) + #cv.imshow("img",img) resize = cv.resize(img,(700,900)) self.img = resize return self.img @@ -28,7 +29,7 @@ def againtencent(self): def touch(self,che_x,che_y,x,y): x1 = np.random.randint(550,600) y1 = np.random.randint(350,550) - time = math.sqrt(abs(che_x - y)**2 + abs(che_y - (x+40))**2) + time = math.sqrt(abs(che_x - x)**2 + abs(che_y - y)**2) cal_time = int(time*2.2) sub.call("adb shell input touchscreen swipe {} {} {} {} {}".format(x1,y1,x1+20,y1+20,cal_time),shell = True) diff --git a/jump/check.py b/jump/check.py new file mode 100644 index 0000000..a8cb43b --- /dev/null +++ b/jump/check.py @@ -0,0 +1,6 @@ +import numpy as np + +a = [1,2,3,4,5,6] + +for i,j in enumerate(a[::-1]): + print(i,j) \ No newline at end of file diff --git a/jump/hist.py b/jump/hist.py new file mode 100644 index 0000000..57a2c4f --- /dev/null +++ b/jump/hist.py @@ -0,0 +1,52 @@ +import cv2 as cv +import numpy as np +import matplotlib.pyplot as plt + + +a = 0 + +def cal_mask(img,channel): + + hist_img = cv.calcHist([img],[channel],None,[256],[0,255]) + hist_img = np.array(hist_img) + shang_data = 0 + right_data = 0 + for index,value in enumerate(hist_img): + right_data = value + if(shang_data == 0 and right_data != 0): + down = index + if(right_data == 0 and shang_data != 0): + up = index + shang_data = right_data + + return down,up + + +if __name__ == "__main__": + + while True: + + img = cv.imread("../test_data/"+str(a)+".png",1) + #img_roi = img[200:540,695:700] # 截取的roi 用作分析直方图 + #cv.imshow("img_ro2",img_ro2) + (b_down,b_up) = cal_mask(img_roi,0) + (g_down,g_up) = cal_mask(img_roi,1) + (r_down,r_up) = cal_mask(img_roi,2) + upper = np.array([b_up,g_up,r_up]) + downer = np.array([b_down-5,g_down-5,r_down-5]) + img_bin = cv.inRange(img,downer,upper) + img_bin = cv.bitwise_not(img_bin) + img_bin = cv.cvtColor(img_bin,cv.COLOR_GRAY2BGR) + img = cv.bitwise_and(img,img_bin) + cv.imshow("img",img) + key_num = cv.waitKey(0) + if key_num == ord("n"): + a += 1 + continue + if key_num == ord("m"): + a -= 1 + continue + if key_num == ord("s"): + break + + cv.waitKey(0) \ No newline at end of file diff --git a/jump/liang.png b/jump/liang.png index fe75fa6..8ca7ade 100644 Binary files a/jump/liang.png and b/jump/liang.png differ diff --git a/jump/process.py b/jump/process.py index fe72e64..2a1a648 100644 --- a/jump/process.py +++ b/jump/process.py @@ -1,113 +1,293 @@ import cv2 as cv -import numpy as np -lower = np.array([105,25,45]) +import numpy as np +import math +# HSV 颜色空间下棋子轮廓阈值 +lower = np.array([105,25,45]) upper = np.array([135,125,130]) -kernel = np.ones((5,5),np.uint8) -# use obj is a necessary way to code -# do use -# api designe and create api -class jumpmaster: +# HSV 颜色空间下棋子轮廓阈值 +kernel = np.ones((5,5),np.uint8) # 膨胀 腐蚀 操作的卷积核 +class jumpmaster: + def __init__(self): # 设置全局变量 self.roi = None # 保存ROI图像变量 - self.chess_pos = None # 保存棋子位置变量 + self.chess_pos = None # 保存棋子位置变量 棋子boudingRect的坐标 + self.chess_pos1 = None # 棋子底部中心点坐标 self.box_pos = None # 保存盒子位置变量 self.che_wh = None - self.box1_pos = None - self.box2_pos = None - self.box3_pos = None + self.box_mask = None + self.top_point = None + self.rightest_point = None + self.leftest_point = None + self.bottom_point = None + self.mid_point = None self.canvas = None # 画布 - + self.mask_val = None # 直方图标志变量, 初始先选定左边作为检测 如果上一次盒子顶点在左 则右 类推 1 左 2 右 + self.index = 0 + + self.final = None + + self.visual_chess = None + + ''' + def cal_singlechannel_mask(self,img,channel): # 计算单一通道颜色阈值 + hist_img = cv.calcHist([img],[channel],None,[256],[0,255]) + hist_img = np.array(hist_img) + shang_data = 0 + right_data = 0 + for index,value in enumerate(hist_img): + right_data = value + if(shang_data == 0 and right_data != 0): + down = index + if(right_data == 0 and shang_data != 0): + up = index + shang_data = right_data + return down,up + ''' + def cal_mask(self,img,channel): #计算游戏背景蒙版 + hist_img = cv.calcHist([img],[channel],None,[256],[0,255]) + hist_img = np.array(hist_img) + shang_data = 0 + right_data = 0 + for index,value in enumerate(hist_img): + right_data = value + if(shang_data == 0 and right_data != 0): + down = index + if(right_data == 0 and shang_data != 0): + up = index + shang_data = right_data + return down,up + + def preprocess(self,img): # 预先处理分析游戏背景阈值 + self.final = np.copy(img) + if self.mask_val == 2: + img_roi = img[200:500,695:700] # 截取的roi 用作分析直方图 + print(2) + else : + img_roi = img[200:500,0:5] + print(1) + (b_down,b_up) = self.cal_mask(img_roi,0) + (g_down,g_up) = self.cal_mask(img_roi,1) + (r_down,r_up) = self.cal_mask(img_roi,2) + upper = np.array([b_up,g_up,r_up]) + downer = np.array([b_down-5,g_down-5,r_down-5]) + #print(downer,upper) + img_bin = cv.inRange(img,downer,upper) + img_bin = cv.bitwise_not(img_bin) + img_bin = cv.cvtColor(img_bin,cv.COLOR_GRAY2BGR) + img = cv.bitwise_and(img,img_bin) + self.mask = cv.bitwise_and(img,img_bin) + cv.imshow("mask",img) + cv.imwrite("/home/liang/jumpmaster/picture/mask/"+"mask"+str(self.index)+".png",self.mask) + return img + def findChess(self,img): # 注释规范 : 操作名称 + 操作作用 - self.canvas = img # 复制图像到画布 因为添加 - roi = img[300:600,:] # 截取ROI图像 作为主要分析对象 + #self.final = np.copy(img ) # 复制图像到画布 直接对Img作图会改变数据 + self.canvas = np.copy(img ) + #cv.imshow("liang",self.np.copy(img )) + # + + + img = self.preprocess(img) # 经过预处理 在盒子位置分离了游戏背景 + roi = img[200:600,:] # 截取ROI图像 作为主要分析对象 + #roi = img # 截取ROI图像 作为主要分析对象 self.roi = roi # 将ROI图像作为全局变量 方便其他函数的使用 - hsv = cv.cvtColor(roi,cv.COLOR_BGR2HSV) # 转换颜色空间 BGR TO HSV + + + hsv = cv.cvtColor(self.roi,cv.COLOR_BGR2HSV) # 转换颜色空间 BGR TO HSV bin_img = cv.inRange(hsv,lower,upper) # 阈值分割 因棋子颜色在游戏运行中稳定 采用阈值分割 跟踪棋子 dliate = cv.dilate(bin_img,kernel,iterations = 2) # 膨胀 将图像膨胀 使得棋子头部和下体连在一起 后面的FindContours函数要用 - erode = cv.erode(dliate,kernel,iterations = 1) # 腐蚀 能够消除二值分割时的图像噪点 得到干净的轮廓图像 使用技巧吧这是 - bin_im,contours,hierarchy = cv.findContours(erode,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_SIMPLE) # 寻找轮廓 如果前面得到干净的二值轮廓 那现在轮廓就只有棋子了 + erode = cv.erode(dliate,kernel,iterations = 2) # 腐蚀 能够消除二值分割时的图像噪点 得到干净的轮廓图像 使用技巧吧这是 + # 素材用 + hsv1 = cv.cvtColor(self.canvas,cv.COLOR_BGR2HSV) # 转换颜色空间 BGR TO HSV + bin_img1 = cv.inRange(hsv1,lower,upper) # 阈值分割 因棋子颜色在游戏运行中稳定 采用阈值分割 跟踪棋子 + dliate1 = cv.dilate(bin_img1,kernel,iterations = 2) # 膨胀 将图像膨胀 使得棋子头部和下体连在一起 后面的FindContours函数要用 + self.visual_chess = cv.erode(dliate1,kernel,iterations = 2) # 腐蚀 能够消除二值分割时的图像噪点 得到干净的轮廓图像 使用技巧吧这是 + # 素材用 + #cv.imshow("chess",erode1) + + contours,hierarchy = cv.findContours(erode,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_SIMPLE) # 寻找轮廓 如果前面得到干净的二值轮廓 那现在轮廓就只有棋子了 for cnt in contours: x,y,w,h = cv.boundingRect(cnt) # 对轮廓分析 得到最大包围矩形信息 长 宽 高等坐标 area = w*h - if area>4000 and area < 5700: # 软件面积滤波 过滤调一些小的不是棋子的色块 - self.chess_pos = (x,y) - self.che_wh = (w,h) + if area>4000 and area < 6500: # 软件面积滤波 过滤调一些小的不是棋子的色块 + self.chess_pos = (x,y) # 棋子的坐标位置 注意这里的位置的是从看的角度出发的 不是从数组的角度出发的 但是可视化时要转化成从数组的角度的 + self.che_wh = (w,h) # 棋子的高和宽 #print("chess position is : x:{},y:{}".format(x+w/2,y+h)) # 调试信息语句 - return x+w/2,y+h + self.chess_pos1 = (int(x+w/2),int(y+h)) # 记录棋子底部中心坐标,方便测试 + cv.circle(self.final,(int(x+w/2),int(y+200+h)),10,(0,0,255),-1) + cv.rectangle(self.final,(x,y+200),(x+w,y+200+h),(0,0,255),3) + + return x+w/2,y+h # 返回棋子底部中心坐标 - def findBox(self): - stop = 0 - edges = cv.Canny(self.roi,100,200) - che_x,che_y = self.chess_pos - # find box pointe1 x1 - for s in range(che_y,che_y + 100): + def findBox(self): + stop = 0 # 标志变量 + last = 0 + #cv.imshow("self.roi",self.roi) + edges = cv.Canny(self.roi,100,200) # Canny 算子提取边缘 + + canvas = self.roi + che_x,che_y = self.chess_pos # 根据棋子的boundingRect将它周围的像素点设为0 因为通过观察有时候棋子的位置会超过盒子 造成识别错误 + for s in range(che_y-10,che_y + 100): # find box pointe1 y1 - for d in range(che_x-20,che_x + 90): - edges[s][d] = 0 - cv.imshow("edgess",edges) - for r,i in enumerate(edges): - for c,j in enumerate(i): + for d in range(che_x-2,che_x + 60): + edges[s][d] = 0 # 将棋子周围像素点设为0 避免下一步的识别盒子 + + for r,i in enumerate(edges): # 遍历盒子二值轮廓图像 找到盒子最顶点 + for c,j in enumerate(i): if j == 255: stop = 1 self.box_pos = (r,c) break if stop == 1: break - cv.circle(self.roi,(c,r),6,(0,0,255),-1) - # o is the array data k is the number - for k,o in enumerate(edges[r+20]): - if o == 255: - #print("x2:",k,"y2:",r+10) - cv.circle(self.roi,(k,r+20),6,(0,0,255),-1) + topx = c + topy = r + if(topx >= 350): + self.mask_val = 1 + else: + self.mask_val = 2 + cv.circle(canvas,(c,r),6,(0,0,255),-1) #测试时用 + + # o 是数组数据 K是行标 + now = 599 + last = 600 # 两个标志变量 刚开始随便赋值 这两个用来比较上一行和这一行的白点的行标 + for leftest_point in range(400-r): #得到在顶点往下还有多少行 + for k,o in enumerate(edges[r+leftest_point]): #遍历整个图像 寻找最左点 据观察 盒子的像素点都是一点一点的 + if o == 255: + #edges[r+leftest_point+1,k-1] = 255 + now = k + break + if now >= last: + cv.circle(canvas,(k,r+leftest_point),6,(0,0,255),-1) # 测试时用 + leftx = k + lefty = r+leftest_point break - # box pointe two - - for q,o in enumerate(edges[r+20][::-1]): - if o == 255: - - cv.circle(self.roi,(700-q,r+20),6,(0,0,255),-1) + last = now + + # the rightest point of box + now = 599 + last = 600 + for rightest_point in range(400-r): + for q,o in enumerate(edges[r+rightest_point][::-1]): + if o == 255: + now = q + break + if now == 0: + rightx = 700 + righty = r+rightest_point break - x1 = k - x2 = 700-q - x3 = int((x2 - x1)/2)+k - y3 = r+45 - x1 = k - y1 = r+20 - x2 = 700-q - y2 = r+20 - cv.line(self.roi,(c,r),(x1,y1),(0,0,255),4) - cv.line(self.roi,(c,r),(x2,y2),(0,0,255),4) - cv.line(self.roi,(x1,y1),(x2,y2),(0,0,255),4) - cv.circle(self.roi,(x3,y3),6,(0,0,255),-1) - cv.line(self.roi,(c,r),(x3,y3),(0,0,255),4) - self.box3_pos = x3,y3 - self.box1_pos = k,y1 - self.box2_pos = x2,y2 - - #print("x1:",x1,"x2 :",x2,"mid: ",int((x2-x1)/2)+x1) - ''' - for q,o in enumerate(edges[r+20,k+10:]): - this_data = o - next_data = edges[r+10][q+1] - if (this_data == 255) and (next_data == 0): - cv.circle(self.roi,(k+q+10,r+10),6,(0,0,255),-1) + if now >= last: + rightx = 700-q + righty = r+rightest_point break - ''' - cv.imshow('canvas2',self.roi) - return r,c + last = now + #cv.circle(canvas,(rightx,righty),6,(0,0,255),-1) #测试时用 + # 过滤 因为会存在 盒子左边点连一块的情况 + + if (lefty - topy) - (righty - topy) > 40: + leftx = topx - (rightx-topx) + lefty = righty + + if (leftx > topx) and (rightx >topx) : # 都在右边 + midx = topx + midy = righty + + if( leftx < topx) and (rightx < topx) : + midx = topx + midy = lefty + + if( leftx < topx) and (rightx > topx) : + midx = int((rightx - leftx)/2)+leftx + midy = int((righty - lefty)/2)+lefty + + # yyyy= math.sqrt((midx-topx)**2+(midy-topy)**2) # 不做过多运算 算了 + + bottomx = (midx-topx)+midx + bottomy = (midy-topy)+midy + + # 下面的语句主要用作visual语句的可视化 + self.mid_point = (midx,midy) + self.bottom_point = (bottomx,bottomy) + self.top_point = (topx,topy) + self.leftest_point = (leftx,lefty) + self.rightest_point = (rightx,righty) + cv.circle(self.mask,(midx,midy+200),10,(203,192,255 ),-1) + cv.circle(self.mask,(bottomx,bottomy+200),10,(203,192,255 ),-1) + cv.circle(self.mask,(topx,topy+200),10,(203,192,255 ),-1) + cv.circle(self.mask,(leftx,lefty+200),10,(203,192,255 ),-1) + cv.circle(self.mask,(rightx,righty+200),10,(203,192,255 ),-1) + + cv.circle(self.final,(midx,midy+200),10,(203,192,255 ),-1) + cv.circle(self.final,(bottomx,bottomy+200),10,(203,192,255 ),-1) + cv.circle(self.final,(topx,topy+200),10,(203,192,255 ),-1) + cv.circle(self.final,(leftx,lefty+200),10,(203,192,255 ),-1) + cv.circle(self.final,(rightx,righty+200),10,(203,192,255 ),-1) + + cv.imshow("box_point",self.mask) + cv.imwrite("/home/liang/jumpmaster/picture/box_point/"+"box_point"+str(self.index)+".png",self.mask) + cv.line(self.mask,(topx,topy+200),(leftx,lefty+200),(203,192,255 ),4) + cv.line(self.mask,(topx,topy+200),(rightx,righty+200),(203,192,255 ),4) + cv.line(self.mask,(topx,topy+200),(midx,midy+200),(203,192,255 ),4) + cv.line(self.mask,(leftx,lefty+200),(rightx,righty+200),(203,192,255 ),4) + cv.line(self.mask,(midx,midy+200),(bottomx,bottomy+200),(203,192,255 ),4) + cv.line(self.mask,(leftx,lefty+200),(bottomx,bottomy+200),(203,192,255 ),4) + cv.line(self.mask,(rightx,righty+200),(bottomx,bottomy+200),(203,192,255 ),4) + - def visual(self): + cv.line(self.final,(topx,topy+200),(leftx,lefty+200),(203,192,255 ),4) + cv.line(self.final,(topx,topy+200),(rightx,righty+200),(203,192,255 ),4) + cv.line(self.final,(topx,topy+200),(midx,midy+200),(203,192,255 ),4) + cv.line(self.final,(leftx,lefty+200),(rightx,righty+200),(203,192,255 ),4) + cv.line(self.final,(midx,midy+200),(bottomx,bottomy+200),(203,192,255 ),4) + cv.line(self.final,(leftx,lefty+200),(bottomx,bottomy+200),(203,192,255 ),4) + cv.line(self.final,(rightx,righty+200),(bottomx,bottomy+200),(203,192,255 ),4) + chex,chey = self.chess_pos1 + cv.line(self.final,(midx,midy+200),(chex,chey+200),(255,0,0 ),4) + cv.imwrite("/home/liang/jumpmaster/picture/final/"+"final"+str(self.index)+".png",self.final) + cv.imshow("box_recon",self.mask) + cv.imwrite("/home/liang/jumpmaster/picture/box_reco/"+"box_reco"+str(self.index)+".png",self.mask) + #cv.circle(self.mask,) + #cv.circle(self.mask,) + return midx,midy + + def visual(self): # 专门用来可视化操作的成员函数 + + + canvas = self.roi - che_x,che_y = self.chess_pos - che_w,che_h = self.che_wh - box_y,box_x = self.box_pos - x3,y3 = self.box3_pos - #cv.line(canvas,(che_x+int(che_w/2),che_y+che_h),(box_x,box_y+50),(0,0,255),5) - #consider why change self.roi and the canvas same - cv.line(canvas,(che_x+int(che_w/2),che_y+che_h),(x3,y3),(0,0,255),4) + + topx,topy = self.top_point + rightx,righty = self.rightest_point + leftx,lefty = self.leftest_point + bottomx,bottomy = self.bottom_point + midx,midy = self.mid_point + + cv.line(canvas,(topx,topy),(leftx,lefty),(0,0,255),4) + cv.line(canvas,(topx,topy),(rightx,righty),(0,0,255),4) + cv.line(canvas,(topx,topy),(midx,midy),(0,0,255),4) + cv.line(canvas,(leftx,lefty),(rightx,righty),(0,0,255),4) + cv.line(canvas,(midx,midy),(bottomx,bottomy),(0,0,255),4) + cv.line(canvas,(leftx,lefty),(bottomx,bottomy),(0,0,255),4) + cv.line(canvas,(rightx,righty),(bottomx,bottomy),(0,0,255),4) cv.imshow("visual",canvas) - cv.imshow("222",self.canvas) + + x,y = self.chess_pos + w,h = self.che_wh + + + cv.imshow("final",self.final) + + + cv.imshow("big_pic",self.canvas) + cv.imshow("chess",self.visual_chess) + cv.imwrite("/home/liang/jumpmaster/picture/big_pic/"+"big_pic"+str(self.index)+".png",self.canvas) + chess_rcon = cv.rectangle(self.canvas,(x,y+200),(x+w,y+h+200),(0,0,255),6) + cv.imshow("big_pic",self.canvas) + cv.imshow("chess",self.visual_chess) + cv.imwrite("/home/liang/jumpmaster/picture/chess_recon/"+"chess_recon"+str(self.index)+".png",chess_rcon) + #self.index += 1 + cv.imwrite("/home/liang/jumpmaster/picture/chess/"+"chess"+str(self.index)+".png",self.visual_chess) if __name__ == "__main__": # follow code use to test api @@ -115,20 +295,16 @@ def visual(self): jum = jumpmaster() while True: stop = 0 - img = cv.imread("../test_data/"+str(img_indx)+".png",-1) + #img = cv.imread("../DataSet/"+str(img_indx)+".png",1) + img = cv.imread("../DataSet/error11.png",1) + cv.imshow("img",img) canvas = np.copy(img) jum.findChess(img) r,c = jum.findBox() cv.circle(canvas,(c,r+300),6,(255,0,0),-1) + jum.visual() cv.imshow("canvas",canvas) - ''' - edges = cv.Canny(roi,100,200) - cv.circle(roi,(c,r),6,(0,0,255),-1) # why? - cv.circle(roi,(c,r+50),6,(0,0,255),-1) - cv.imshow("roi",roi) - cv.imshow("edge",edges) - ''' img_indx +=1 key_num = cv.waitKey(0) if key_num == ord("n"): diff --git a/process/sub.py b/liang.png similarity index 100% rename from process/sub.py rename to liang.png diff --git a/main.py b/main.py index 481b469..04990fc 100644 --- a/main.py +++ b/main.py @@ -8,31 +8,48 @@ mx = 0 my = 0 ratio = 0.5 + def mouse_val(event,x,y,flags,param): - global mx,my,che_x,che_y,ratio + global mx,my,che_x,che_y,ratio,a if event == cv.EVENT_LBUTTONDOWN: + cv.imwrite("error"+str(a)+".png",img) + """ x1 = np.random.randint(550,600) y1 = np.random.randint(350,550) time = math.sqrt(abs(che_x - x)**2 + abs(che_y - y)**2) #print("distance : ",math.sqrt(abs(che_x - x)**2 + abs(che_y - y)**2)) cal_time = int(time*2.2) adb.touch(x1,y1,cal_time) + """ if __name__ == "__main__": + adb = Adb() jmp = jumpmaster() + + #mouse_val() while True: img = adb.screenshot() # 发送ADB指令截图 + cv.imwrite("error11.png",img) try: che_x,che_y = jmp.findChess(img) x,y = jmp.findBox() jmp.visual() - cv.waitKey(500) - adb.touch(che_x,che_y,x,y) - + cv.waitKey(1000) + adb.touch(che_x,che_y,x,y) + jmp.index+=1 except TypeError : + print(TypeError) + cv.imwrite("error1.png",img) + jmp.index+=1 + ''' + cv.imshow("s",erode) # 如果出现错误 在process.py中合适的位置放此语句调试 + cv.waitKey(0) + ''' + continue - cv.waitKey(800) - + + cv.waitKey(1000) + cv.destroyAllWindows() diff --git a/process/FGVisonUtil.py b/process/FGVisonUtil.py deleted file mode 100755 index 6a53d0a..0000000 --- a/process/FGVisonUtil.py +++ /dev/null @@ -1,242 +0,0 @@ -# -*- coding: utf-8 -*- -import cv2 -import numpy as np - -import matplotlib.pyplot as plt -import math -import random - -class FGVisionUtil: - ''' - 凡哥的机器视觉工具箱 - - ''' - - - @staticmethod - def cal_rgb_margin(img): - ''' - 计算采样色块区域RGB 三通道的阈值 - ''' - # 计算色块的 - - (minB, maxB) = FGVisionUtil.cal_single_margin(img, 0) - (minG, maxG) = FGVisionUtil.cal_single_margin(img, 1) - (minR, maxR) = FGVisionUtil.cal_single_margin(img, 2) - - threshold_lower = np.int32([minB, minG, minR]) - threshold_upper = np.int32([maxB, maxG, maxR]) - - return (threshold_lower, threshold_upper) - - @staticmethod - def cal_single_margin(img, channel): - ''' - 计算采样色块区域单个通道的阈值边界 - ''' - # 柱形统计 - hist = cv2.calcHist([img], [channel], None, [256], [0, 256]) - hist = hist.reshape((len(hist))) - # 概率分布 - prob = hist / hist.sum() - # 计算颜色累计分布 - prob_accum = np.zeros_like(prob) - prob_accum[0] = prob[0] - - - # 阈值下界确定状态 - lower_status = False - # 阈值上界确定状态 - upper_status = False - - # 概率累计分布最小值 - - lower_prob = 0.05 - # 概率累计分布最大值 - - upper_prob = 0.95 - - # 阈值下界值 - lower_value = 0 - # 阈值上界值 - upper_value = 0 - - for i in range(1, len(prob)): - prob_accum[i] = prob[i] + prob_accum[i-1] - - # 确定阈值下界 - if not lower_status and prob_accum[i] > lower_prob: - lower_value = i - lower_status = True - # 确定阈值上界 - if not upper_status and prob_accum[i] > upper_prob: - upper_value = i - upper_status = True - - - return (lower_value, upper_value) - - @staticmethod - def draw_gray_hist(img): - ''' - 绘制灰度图的直方图 - ''' - # 样例图片 - plt.hist(img.ravel(), bins=256, range=[0, 256]) - plt.show() - - @staticmethod - def draw_rgb_hist(img): - ''' - 绘制RGB彩图的直方图 - ''' - # 获取顶部长条(只有背景图片) - color = ('b', 'g', 'r') - for i, col in enumerate(color): - histr = cv2.calcHist([img], [i], None, [256], [0, 256]) - plt.plot(histr, color=col) - plt.xlim([0, 256]) - plt.show() - - @staticmethod - def justify_rgb_value(color): - ''' - 根据RGB的取值范围重新调整 RGB的值 - ''' - MIN_RGB_VALUE = 0 - MAX_RGB_VALUE = 255 - - ncolor = np.copy(color) - for channel in range(3): - if ncolor[channel] < MIN_RGB_VALUE: - ncolor[channel] = MIN_RGB_VALUE - elif ncolor[channel] > MAX_RGB_VALUE: - ncolor[channel] = MAX_RGB_VALUE - return ncolor - - @staticmethod - def contours_filter(contours, minWidth=None, maxWidth=None, minHeight=None, maxHeight=None, minArea=None): - ''' - contours筛选器 - ''' - newCntList = [] - - for cnt in contours: - - rect = cv2.minAreaRect(cnt) # 获取最小矩形区域 - area = cv2.contourArea(cnt) # 获取contour的面积 - - width = rect[1][0] - height = rect[1][1] - - if minWidth and width < minWidth: - continue - if maxWidth and width > maxWidth: - continue - if minHeight and height < minHeight: - continue - if maxHeight and height > maxHeight: - continue - if minArea and area < minArea: - continue - - newCntList.append(cnt) - return newCntList - - - @staticmethod - def isPointInRectangle(rect, pt): - (px, py) = pt - (x, y, w, h) = rect - - if px < x or px > x + w: - return False - elif py < y or px > y + h: - return False - - return True - - @staticmethod - def printImgInfo(img): - print("================打印一下图像的属性================") - print("图像对象的类型 {}".format(type(img))) - print(img.shape) - print("图像宽度: {} pixels".format(img.shape[1])) - print("图像高度: {} pixels".format(img.shape[0])) - print("通道: {}".format(img.shape[2])) - print("图像分辨率: {}".format(img.size)) - print("数据类型: {}".format(img.dtype)) - - @staticmethod - def cal_distance(pt1, pt2): - ''' - 获取棋子与下一跳盒子的距离 - ''' - (x1, y1) = pt1 - (x2, y2) = pt2 - - return math.sqrt(math.pow((x2 - x1), 2) + math.pow((y2 - y1), 2)) - - @staticmethod - def fitBGRBValue(rgb_value, addWeight=0): - ''' - rgb值 添加或者减去一个值,并确保数值范围在合理区间内 0 - 255 - ''' - MIN_VALUE = 0 - MAX_VALUE = 255 - for i in range(len(rgb_value)): - if rgb_value[i] + addWeight < MIN_VALUE: - rgb_value[i] = MIN_VALUE - elif rgb_value[i] + addWeight > MAX_VALUE: - rgb_value[i] = MAX_VALUE - else: - rgb_value[i] += addWeight - return rgb_value - - @staticmethod - def findCurveBoundary(array, start, win_size=1, zero_threshold=0, offset=(0,0)): - ''' - 给定一个切入点, 获取该点所在颜色分布 - ''' - bin_num = len(array) - leftb = start - rightb = start - while leftb >= 0 and array[leftb] > zero_threshold: - leftb -= 1 - - while rightb < bin_num and array[rightb] > zero_threshold: - rightb += 1 - - return (max(0, leftb*win_size+offset[0]), min(255, rightb*win_size+offset[1])) - - @staticmethod - def getMaxCurveBoundary(array, win_size=4,zero_threshold=0, offset=(0,0)): - ''' - 找到背景色的边界, 默认占比最大的颜色分布为背景色的颜色分布 - ''' - segments = [] - bin_num = len(array) - - binIdx = 0 - while binIdx < bin_num: - if array[binIdx] < zero_threshold: - #print('next %d'%(binIdx)) - pass - else: - # 找到一个区域 - segment = [binIdx, binIdx, array[binIdx]] - binIdx += 1 - while binIdx < bin_num and array[binIdx] > zero_threshold: - segment[1] = binIdx - segment[2] += array[binIdx] - binIdx += 1 - segments.append(segment) - binIdx += 1 - - # 从segments列表中寻找面积最大的(segment[2]) - max_segment = max(segments, key=lambda s:s[2]) - return (max(0,max_segment[0]*win_size+offset[0]), min(255,max_segment[1]*win_size+offset[1])) - - @staticmethod - def generateRandomColor(): - return (random.randint(0,255), random.randint(0,255), random.randint(0,255)) diff --git a/process/SampleCollect.py b/process/SampleCollect.py deleted file mode 100755 index 6961466..0000000 --- a/process/SampleCollect.py +++ /dev/null @@ -1,61 +0,0 @@ -# -*- coding: utf-8 -*- -''' -获取部分测试样例 -存放在./samples文件夹下. - -''' - -import numpy as np -import cv2 -# 如果你选了多个摄像头的话, 需要设定VideoCapture序号, 1 or 0 or else。 -# 0 : camera on my laptop -# 1 : usb camera -cap = cv2.VideoCapture(1) - -# 这里可以设置画面的宽度跟高度 -# cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280) -# cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720) -# 图像采集计数 -img_count = 1 - -while(True): - # Capture frame-by-frame - # 逐帧获取画面 - # ret 画面是否获取成功 - # True 获取成功 - # False 获取失败 - ret, frame = cap.read() - - # 转变为灰度图 - # gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) - - # 展示图片 - # 这里的'frame' 指代的是窗口名称为fram - #cv2.imshow('frame', frame) - # 镜像翻转, 你可能不需要 - cv2.flip(frame, -1) - # 获取图片的行数 列数, 与通道数 - (rows,cols,channels) = frame.shape - - # 这里我旋转了一下图像, 因为我采集过来是横着的,所以需要旋转90度 - M = cv2.getRotationMatrix2D((cols/2,rows/2),90,1) - dst = cv2.warpAffine(frame, M, (cols,rows)) - # 显示最终画面。 - cv2.imshow('frame', dst) - # 等待按键按下, 最多等待1ms - key = cv2.waitKey(1) - # 如果按键等于q (小写q) - if key == ord('q'): - # 退出程序 - break - elif key == ord('c'): - # 如果按键是c 说明需要捕捉画面 - cv2.imwrite("{}.png".format(img_count), dst) - # 画面计数+1 - img_count += 1 - -# 程序退出的时候 -# 释放VideoCapture -cap.release() -# 关闭所有窗口 -cv2.destroyAllWindows() diff --git a/process/SampleLabel.py b/process/SampleLabel.py deleted file mode 100755 index 1dd55b9..0000000 --- a/process/SampleLabel.py +++ /dev/null @@ -1,177 +0,0 @@ -''' -程序说明: - 程序类用于通过鼠标手动标注两个关键点坐标 - 1. 棋子中心 - 2. 下一跳盒子的中心 -''' - -import cv2 -import numpy as np -import datetime -import math -import copy -from ADBHelper import ADBHelper - -# MP : Mark Process 标注过程 -MP_UNMARK = 0 # 0 : 未进行标注 -MP_MARKED_FCHESS = 1 # 1 : 标注了小人的底部 -MP_MARKED_CBOX = 2 # 2 : 标注了box的中心点 - -''' -手动标注 两个标签 - -''' -def markChessAndBoxByHand(event,x,y,flags,sampleLabel): - - if event == cv2.EVENT_LBUTTONDOWN: - print("click: x= {}, y={}".format(x, y)) - sampleLabel.addLabel(x, y) - - -class SampleLabel: - def __init__(self, save_path='./', label_filename='label.txt'): - self.img = None # 原来的图片 - self.canvas = None # 画布 - self.img_name = None # 图片名称 - self.mp = 0 # 标注的进程 mark process - self.fchess = (0, 0) # 棋子底部中心 - self.cbox = (0, 0) # 下一条盒子的中心 - self.save_path = save_path # 图像的保存路径 - self.label_filename = label_filename # 标签记录文件的文件名 - # self.label_file = open(label_filename, 'w+') # 文件对象 - self.winname = 'label' - - # 创建一个窗口 - cv2.namedWindow(self.winname, flags= cv2.WINDOW_NORMAL | cv2.WINDOW_FREERATIO) - # 设置鼠标事件的回调函数 - cv2.setMouseCallback(self.winname, markChessAndBoxByHand, self) - - - def updateImg(self, img, img_name = None): - # 更新当前源图像 - 深度拷贝 - self.img = img.copy() - # 更新画布 - 深度拷贝 - self.canvas = img.copy() - # 重置 棋子底部坐标 - self.fchess = (0, 0) - # 重置盒子的中心 - self.cbox = (0, 0) - - if img_name == None: - # 根据时间戳 生成文件名 - self.img_name = f"{datetime.datetime.now():%Y-%m-%d-%H-%M-%S-%f.png}" - else: - # 如果有名字的话就直接赋值 - self.img_name = img_name - - # 重置标注状态 - self.mp = MP_UNMARK - # 更新画布 - self.updateCanvas() - - def printProcessOnCanvas(self, info): - ''' - 在画布上显示帮助信息 - ''' - # 首先更新画布 - # self.updateCanvas() - self.canvas[50:150,:] = 255 - # 选择字体 - font = cv2.FONT_HERSHEY_SIMPLEX - fontScale = 1 - cv2.putText(self.canvas, text=info, org=(100, 100), fontFace=font, fontScale=fontScale, thickness=1, - lineType=cv2.LINE_AA, color=(0, 0, 255)) - - - cv2.imshow(self.winname, self.canvas) - - def updateCanvas(self): - ''' - 根据状态更新画布 与文字提示 - ''' - # Use Deep Copy - self.canvas = self.img.copy() - - rmarker = 10 # 标记半径 - if self.mp >= MP_MARKED_FCHESS: - # 绘制chess中心 - # 绘制棋子底部的中心点 红色实心 - cv2.circle(img=self.canvas, center=self.fchess, radius=rmarker, color=(0, 0, 255), thickness=-1) - - if self.mp >= MP_MARKED_CBOX: - # 绘制下一条盒子中心 - cv2.circle(img=self.canvas, center=self.cbox, radius=rmarker, color=(0, 255, 0), thickness=-1) - - if self.mp == MP_UNMARK: - self.printProcessOnCanvas("step-0 unmarked, mark chess footer first.") - - elif self.mp == MP_MARKED_FCHESS: - self.printProcessOnCanvas("step-1 you need to mark next box center.") - - elif self.mp == MP_MARKED_CBOX: - self.printProcessOnCanvas("step-2 mark done, save (s) or cancel (c)") - - cv2.imshow(self.winname, self.canvas) - - def addLabel(self, x, y): - ''' - 添加标签 - ''' - if self.mp == MP_UNMARK: - # 当前标注的是棋子脚底 - self.fchess = (x, y) - # 更新状态码 - self.mp = MP_MARKED_FCHESS - - elif self.mp == MP_MARKED_FCHESS: - # 当前标注的是盒子的中心 - self.cbox = (x, y) - # 更新状态码 - self.mp = MP_MARKED_CBOX - else: - print("标注已完成") - - ''' - # 打印标注信息 - print("fchess") - print(self.fchess) - print("cbox") - print(self.cbox) - print("mp") - print(self.mp) - ''' - self.updateCanvas() - - def isMarkDone(self): - ''' - 返回是否标注完成 - ''' - return self.mp == MP_MARKED_CBOX - - def saveImg(self): - ''' - 保存图片 - ''' - # 保存样本素材 - cv2.imwrite(self.save_path + self.img_name, self.img) - # 保存标注后的图片 - cv2.imwrite(self.save_path + 'log/' + self.img_name, self.canvas) - - def label2string(self): - ''' - 将标签转换为字符串, 用于保存在label.txt中 - ''' - (x1, y1) = self.fchess - (x2, y2) = self.cbox - return ",".join([self.img_name, str(x1), str(y1), str(x2), str(y2)]) + '\n' - - def saveLabelInfo(self): - ''' - 添加标注信息 追加模式 - ''' - with open(self.label_filename, 'a+') as f: - f.write(self.label2string()) - - def onDestroy(self): - # 关闭窗口 - cv2.destroyWindow(self.winname) \ No newline at end of file diff --git a/process/SampleROI.py b/process/SampleROI.py deleted file mode 100755 index 866a538..0000000 --- a/process/SampleROI.py +++ /dev/null @@ -1,86 +0,0 @@ -# -*- coding: utf-8 -*- -''' -通过SelectROI 组件获取要识别的区域 - -因为没有必要处理所有的画面, 下一跳都在图像上方. - - -这里我们测的的ROI为 -(166, 4, 325, 363) - -从(166, 4)开始的, 宽度为325, 高度为363的矩形框. - - -接下来我们要批量处理其他的sample. 看roi是否满足. -''' - - -import cv2 -import numpy as np - -''' - -选择一个矩形区域 -如果要取消选中的话, 直接在旁边点击一下就好了 - -摁住 Space 选中 - -也有文章说是Enter按键 - -''' - - -def select_game_roi(img_path): - - # Read image - img = cv2.imread(img_path) - - cv2.imshow("image", img) - # 是否显示网格 - showCrosshair = True - - # 如果为Ture的话 , 则鼠标的其实位置就作为了roi的中心 - # False: 从左上角到右下角选中区域 - fromCenter = False - # Select ROI - r = cv2.selectROI("image", img, showCrosshair, fromCenter) - - print(r) - # Crop image - imCrop = img[int(r[1]):int(r[1]+r[3]), int(r[0]):int(r[0]+r[2])] - - # Display cropped image - cv2.imshow("image_roi", imCrop) - cv2.imwrite("image_roi.png", imCrop) - cv2.waitKey(0) - - -#测试, GUI的方式测量ROI -sample_01_path = "./samples/1.png" - -select_game_roi(sample_01_path) - - - -def select_all_sample_roi(sample_folder): - - from glob import glob - - r = (166, 4, 325, 363) - - sample_path_list = glob("%s/*.png"%(sample_folder)) - - # 遍历所有的样本图片 - for sp in sample_path_list: - img = cv2.imread(sp) - - imCrop = img[int(r[1]):int(r[1]+r[3]), int(r[0]):int(r[0]+r[2])] - - cv2.imwrite('./samples_roi/%s'%(sp[len(sample_folder)+1:]), imCrop) - -''' -将所有的测试样例, 按照roi截取 -''' -''' -select_all_sample_roi("./samples") -''' \ No newline at end of file diff --git a/process/ThresholdEditorGUI.py b/process/ThresholdEditorGUI.py deleted file mode 100755 index b7cfdf5..0000000 --- a/process/ThresholdEditorGUI.py +++ /dev/null @@ -1,89 +0,0 @@ -# -*- coding: utf-8 -*- -''' -获取棋子的颜色阈值. - -经过调试, - -lower = [19 0 0] -upper = [74 16 19] - -''' - -import cv2 -import numpy as np - -# 样例图片 -# sample_img = cv2.imread("./samples_roi/1.png") -sample_img = cv2.imread("tmp.png") - -# 颜色阈值 Upper -threshold_upper = None -# 颜色阈值 Lower -threshold_lower = None - - -# 更新MASK图像,并且刷新windows -def updateMask(): - global sample_img - global threshold_lower - global threshold_upper - - # 计算MASK - mask = cv2.inRange(sample_img, threshold_lower, threshold_upper) - - cv2.imshow('mask', mask) - -# 更新阈值 -def updateThreshold(x): - - global threshold_lower - global threshold_upper - - minR = cv2.getTrackbarPos('minR','image') - maxR = cv2.getTrackbarPos('maxR','image') - minG = cv2.getTrackbarPos('minG','image') - maxG = cv2.getTrackbarPos('maxG', 'image') - minB = cv2.getTrackbarPos('minB', 'image') - maxB = cv2.getTrackbarPos('maxB', 'image') - - threshold_lower = np.int32([minB, minG, minR]) - threshold_upper = np.int32([maxB, maxG, maxR]) - - print('更新阈值') - print(threshold_lower) - print(threshold_upper) - updateMask() - -cv2.namedWindow('image', flags= cv2.WINDOW_NORMAL | cv2.WINDOW_FREERATIO) -# cv2.namedWindow('image') -cv2.imshow('image', sample_img) - -# cv2.namedWindow('mask') -cv2.namedWindow('mask', flags= cv2.WINDOW_NORMAL | cv2.WINDOW_FREERATIO) - -# 函数原型 -# createTrackbar(trackbarName, windowName, value, count, onChange) -> None -# 解释 -# 在window‘iamge’ 上创建一个滑动条,起名为Channel_XXX, 设定滑动范围为0-255, -# onChange事件回调 啥也不做 - -# 红色阈值 Bar -cv2.createTrackbar('minR','image',0,255,updateThreshold) -cv2.createTrackbar('maxR','image',0,255,updateThreshold) -# 绿色阈值 Bar -cv2.createTrackbar('minG','image',0,255,updateThreshold) -cv2.createTrackbar('maxG','image',0,255,updateThreshold) -# 蓝色阈值 Bar -cv2.createTrackbar('minB','image',0,255,updateThreshold) -cv2.createTrackbar('maxB','image',0,255,updateThreshold) - -print("调试棋子的颜色阈值, 键盘摁e退出程序") - -# 首次初始化窗口的色块 -# 后面的更新 都是由getTrackbarPos产生变化而触发 -updateThreshold(None) - -while cv2.waitKey(0) != ord('e'): - continue - -cv2.destroyAllWindows() \ No newline at end of file diff --git a/process/binary.py b/process/binary.py deleted file mode 100644 index 74f1eb5..0000000 --- a/process/binary.py +++ /dev/null @@ -1,11 +0,0 @@ -import cv2 as cv -import numpy as np - -mask = cv.imread('mask.png',-1) - - -cv.imshow('mask',mask) - -cv.waitKey(0) -cv.destroyAllWindows() - diff --git a/process/canny.py b/process/canny.py deleted file mode 100644 index ae4ee3d..0000000 --- a/process/canny.py +++ /dev/null @@ -1,25 +0,0 @@ -import cv2 as cv -import numpy as np - -img = cv.imread('57.png',1) - -img1 = cv.Canny(img,50,100) - -canvas = np.copy(img) - -img,contours,hed = cv.findContours(img1, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE) - -for c in contours: - if cv.contourArea(c)>800: - - x,y,w,h = cv.boundingRect(c) - if x<140: - cv.rectangle(canvas,(x,y),(x+w,y+h),(255,255,0),5) - cv.circle(canvas,(int(x+w/2),int(y+h/2)),5,(0,0,255),-1) - cv.imshow('canvas',canvas) - -cv.imshow('img1',img1) -#cv.imshow('img',img) -cv.waitKey(0) -cv.destroyAllWindows() - diff --git a/process/circle.png b/process/circle.png deleted file mode 100644 index 3e16e04..0000000 Binary files a/process/circle.png and /dev/null differ diff --git a/process/cv.png b/process/cv.png deleted file mode 100644 index 3c70984..0000000 Binary files a/process/cv.png and /dev/null differ diff --git a/process/getThreshold.py b/process/getThreshold.py deleted file mode 100644 index 1c355fb..0000000 --- a/process/getThreshold.py +++ /dev/null @@ -1,69 +0,0 @@ -import cv2 as cv -import numpy as np - - - -def updateImage(): - - global imgHsv - - imgBin = cv.inRange(imgHsv,lower_th,up_th) - cv.imshow('imgBin',imgBin) - - -def updateThreshold(x): - - global lower_th - global up_th - - minH = cv.getTrackbarPos('minH','img') - maxH = cv.getTrackbarPos('maxH','img') - minS = cv.getTrackbarPos('minS','img') - maxS = cv.getTrackbarPos('maxS','img') - minV = cv.getTrackbarPos('minV','img') - maxV = cv.getTrackbarPos('maxV','img') - - lower_th = np.int32([minH,minS,minV]) - up_th = np.int32([maxH,maxS,maxV]) - - updateImage() - print(lower_th) - print(up_th) - - - - -def main(img): - - global imgHsv - - cv.namedWindow('img') - imgHsv = cv.cvtColor(img,cv.COLOR_BGR2HSV) - cv.createTrackbar('minH','img',0,255,updateThreshold) - cv.createTrackbar('maxH','img',0,255,updateThreshold) - cv.setTrackbarPos('maxH','img',255) - cv.createTrackbar('minS','img',0,255,updateThreshold) - cv.createTrackbar('maxS','img',0,255,updateThreshold) - cv.setTrackbarPos('maxS','img',255) - cv.createTrackbar('minV','img',0,255,updateThreshold) - cv.createTrackbar('maxV','img',0,255,updateThreshold) - cv.setTrackbarPos('maxV','img',255) - - cv.imshow("img",img) - - while cv.waitKey(0) != ord('e'): - continue - - - cv.destroyAllWindows() - - - 107 154 46 - 123 247 121 - - -if __name__ == '__main__': - - img = cv.imread('987.png',-1) - - main(img) diff --git a/process/jump.py b/process/jump.py deleted file mode 100644 index a57b681..0000000 --- a/process/jump.py +++ /dev/null @@ -1,158 +0,0 @@ -import cv2 as cv -import numpy as np - - -class Jumper(): - - def __init__(self,img): - - self.img = img - self.roi = self.img[250:550,0:600] - self.imgHsv = None - self.che_pos = (50,50,50,50) - self.box_pos = None - - - - self.che_mask = None - - self.color_lower = np.int32([107,154,46]) - self.color_upper = np.int32([123,247,121]) - - def cal_che_pos(self): - - self.imgHsv = cv.cvtColor(self.roi,cv.COLOR_BGR2HSV) - self.che_mask = cv.inRange(self.imgHsv,self.color_lower,self.color_upper) - - canny_che_img = cv.Canny(self.che_mask,60,150) - - - - - # morphological processing - - kernel = cv.getStructuringElement(cv.MORPH_RECT,(8,8)) - self.che_mask = cv.morphologyEx(self.che_mask,cv.MORPH_OPEN,kernel) # noise eliminate - self.che_mask = cv.morphologyEx(self.che_mask,cv.MORPH_CLOSE,kernel) # connect the head and body - - cv.imshow('che_mask',self.che_mask) - - img,contours,hier = cv.findContours(self.che_mask,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_SIMPLE) - - for c in contours: - - (x,y,w,h) = cv.boundingRect(c) - self.che_pos = (x,y,w,h) - - - - def cal_box_pos(self): - - canny_img = cv.Canny(self.roi,60,150) - - chang,kuan= np.shape(canny_img) - - cx,cy,cw,ch = self.che_pos - - # - for x1 in np.arange(cx,cx+50): - for y1 in np.arange(cy-10,cy+70): - canny_img[y1][x1] = 0 - - # mask top point of the box - for i in np.arange(0,600): - for d in np.arange(0,300): - if canny_img[row][clo] != 0: - top_point = (i,d) - break - - - - img,contours,hier = cv.findContours(canny_img,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_SIMPLE) - - for c in contours: - - x,y,w,h = cv.boundingRect(c) - - if abs(x-cx)>50 : - - self.box_pos = (x,y,w,h) - - - - def display(self): - - canvas = np.copy(self.roi) - - # draw the chess body - x,y,w,h = self.che_pos - cv.rectangle(canvas,(x,y),(x+w,y+h),(255,0,0),5) - cv.circle(canvas,(int(x+w/2),y+h),5,(0,0,255),-1) - - # draw the box body - #cv.circle(canvas,(int(bx+bw/2),int(by+bh/2)),5,(0,0,255),-1) - - - - #cv.imshow('che_mask',self.che_mask) - cv.imshow('canvas',canvas) - - - -if __name__ == "__main__": - - a = np.arange(41,68) - for i in a: - - img = cv.imread(str(i)+'.png',-1) - jumper = Jumper(img) - jumper.cal_che_pos() - jumper.cal_box_pos() - - jumper.display() - k = cv.waitKey(0) - if k == ord('n'): - pass - - - - - cv.waitKey(0) - cv.destroyAllWindows() - -''' - cap = cv.VideoCapture(1) - cap.set(cv.CAP_PROP_FRAME_WIDTH, 1920) - cap.set(cv.CAP_PROP_FRAME_HEIGHT, 1080) - cv.namedWindow('image_win',flags=cv.WINDOW_NORMAL | cv.WINDOW_KEEPRATIO | cv.WINDOW_GUI_EXPANDED) - - - - while(True): - - ret,frame = cap.read() - jumper = Jumper(frame) - - jumper.cal_che_pos() - jumper.display() - - - cv.imshow('window',frame) - cv.waitKey(10) - key = cv.waitKey(1) - if key == ord('q'): - # 如果按键为q 代表quit 退出程序 - print("程序正常退出...Bye 不要想我哦") - break - elif key == ord('c'): - ## 如果c键按下,则进行图片保存 - # 写入图片 并命名图片为 图片序号.png - cv.imwrite("987.png", frame) - - -cap.release() -# 销毁所有的窗口 -cv.destroyAllWindows() -''' - - diff --git a/process/jump_phone_x.py b/process/jump_phone_x.py deleted file mode 100644 index b74a756..0000000 --- a/process/jump_phone_x.py +++ /dev/null @@ -1,224 +0,0 @@ -# coding: utf-8 -import os -import sys -import subprocess -import shutil -import time -import math -from PIL import Image, ImageDraw -import random -import json -import re - -import cv2 -import numpy as np -from scipy import ndimage -import serial -import struct -import os - - -def rotateImage(image, angle): - img_size=image.shape - img_c=img_size[2] - img_w=img_size[1] - img_h=img_size[0] - img_max_size=max(img_w,img_h) - des_img=np.zeros((img_max_size,img_max_size,img_c),dtype=np.uint8) - if img_h==img_max_size: - des_img[:,int((img_max_size-img_w)/2):int((img_max_size-img_w)/2)+img_w]=image.copy() - else: - des_img[int((img_max_size-img_h)/2):int((img_max_size-img_h)/2)+img_h,:]=image.copy() - image_center = (img_max_size/2,img_max_size/2) - rot_mat = cv2.getRotationMatrix2D(image_center,angle,1) - result = cv2.warpAffine(des_img, rot_mat, (img_max_size,img_max_size),flags=cv2.INTER_LINEAR) - if img_h==img_max_size: - result_crop=result[int((img_max_size-img_w)/2):int((img_max_size-img_w)/2)+img_w,:] - else: - result_crop=result[:,int((img_max_size-img_h)/2):int((img_max_size-img_h)/2)+img_h] - return result_crop - - -def open_op(mask): - kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3, 3)) - opened_mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel) - return opened_mask - -def open_op_large(mask): - kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(8, 8)) - opened_mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel) - return opened_mask - -def open_op_mid(mask): - kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5, 5)) - opened_mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel) - return opened_mask - -def close_op(mask): - kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3, 3)) - closed_mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel) - return closed_mask - -def dila_op(mask): - kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3, 6)) - closed_mask = cv2.morphologyEx(mask, cv2.MORPH_DILATE, kernel) - return closed_mask - -def close_op_large(mask): - kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(6, 12)) - closed_mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel) - return closed_mask - - -#detect the jump body -#color -def self_detect(img): - region_upper=int(img.shape[0]*0.3) - region_lower=int(img.shape[0]*0.7) - region=img[region_upper:region_lower] - - hsv_img=cv2.cvtColor(region,cv2.COLOR_BGR2HSV) - color_lower=np.int32([105,25,45]) - color_upper=np.int32([135,125,130]) - - color_mask = cv2.inRange(hsv_img, color_lower, color_upper) - - color_mask = open_op(color_mask) - color_mask = close_op_large(color_mask) - #cv2.imshow('color_mask_self',color_mask) - - contours= cv2.findContours(color_mask,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)[1] - if len(contours)>0: - max_contour = max(contours, key=cv2.contourArea) - max_contour = cv2.convexHull(max_contour) - - rect = cv2.boundingRect(max_contour) - x,y,w,h = rect - - center_coord=(x+w/2,y+h+region_upper - 10) - cv2.circle(img, center_coord, 5, (0,255,0), -1) - - return center_coord - - -#goal block detect -def goal_detect(img,body_position): - region_upper=int(img.shape[0]*0.3) - region_lower=int(img.shape[0]*0.6) - - if body_position[0]<(img.shape[1]/2.0): - region_left=body_position[0]+15 - region_right=img.shape[1] - else: - region_left=0 - region_right=body_position[0]-15 - - region = img[region_upper:region_lower, region_left:region_right] - - edge_region_list=[] - for idx in xrange(3): - region_gray=cv2.cvtColor(region,cv2.COLOR_BGR2HSV)[:,:,idx] - region_shape=region.shape - region_gray=cv2.GaussianBlur(region_gray,(5,5),0) - region_sobel = np.abs(cv2.Sobel(region_gray,cv2.CV_32F,0,1,ksize=3)) - cv2.imshow('region_sobel', region_sobel) - region_sobel = np.uint8(region_sobel) - region_sobel=cv2.threshold(region_sobel,15,255,cv2.THRESH_BINARY)[1] - region_sobel=open_op(region_sobel) - region_sobel=close_op_large(region_sobel) - region_sobel=np.uint8(region_sobel) - edge_region_list.append(region_sobel) - - region_sobel_final=np.bitwise_or(edge_region_list[0],edge_region_list[1]) - region_sobel_final=np.bitwise_or(region_sobel_final,edge_region_list[2]) - #cv2.imshow('region',region_sobel_final) - contours= cv2.findContours(region_sobel_final,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)[1] - - if len(contours)>0: - contours_all=np.empty((0,1,2)) - for cnt in contours: - if cv2.contourArea(cnt)>50: - contours_all=np.concatenate((contours_all,cnt),axis=0) - - most_up_args=np.argmin(contours_all[:,0,1]) - most_up_point_sum=np.float32([0,0]) - most_up_point_sum[0]=contours_all[most_up_args,0,0] - most_up_point_sum[1]=contours_all[most_up_args,0,1] - most_up_point=most_up_point_sum - - most_up_point[1]+=35 - most_up_point[0]+=region_left - most_up_point[1]+=region_upper - cv2.circle(img, (int(most_up_point[0]),int(most_up_point[1])), 5, (0,0,255), -1) - return most_up_point - -def cal_dis(center1,center2): - - dis_x=abs(center1[0]-center2[0]) - dis_y=abs(center1[1]-center2[1]) - dis=np.sqrt(pow(dis_x,2)+pow(dis_y,2)) - return dis - - -def check_adb(): - flag = os.system('adb devices') - if flag == 1: - print('请安装ADB并配置环境变量') - sys.exit() - -idx = 0 -def pull_screenshot(): - process = subprocess.Popen('adb shell screencap -p', shell=True, stdout=subprocess.PIPE) - screenshot = process.stdout.read() - if sys.platform == 'win32': - screenshot = screenshot.replace(b'\r\n', b'\n') - f = open('autojump.png', 'wb') - f.write(screenshot) - f.close() - global idx - f = open('test_imgs/img_%d.png'%(idx), 'wb') - f.write(screenshot) - f.close() - idx +=1 - -def serial_send(Serial,dis): - send_str=struct.pack(' 游戏大师 - --------------------------------------- - 功能列表 - * 去除背景与阴影部分 - * 获取棋子的位置 - * 获取下一跳盒子的中心点的位置 - * 计算棋子与下一跳盒子的距离 - - ''' - def __init__(self, img): - # 采集的图像 - self.img = img - self.img_nobg = None # 去除背景与阴影的图片 - - # 背景图片 - self.bg_lcolor = None # 背景颜色阈值下界 background color lower - self.bg_ucolor = None # 背景颜色阈值上界 background color upper - self.bg_mask = None # 背景的罩层 background mask - - # 阴影部分 - self.shd_lcolor = None # 盒子阴影颜色阈值下界 shadow color lower - self.shd_ucolor = None # 盒子阴影颜色阈值上界 shadow color upper - self.shd_mask = None # 盒子阴影罩层 shadow mask - - # 棋子 (画面中的小人) - self.chs_lcolor = np.int32([105, 25, 45]) # 棋子的颜色阈值下界 chess color lower - self.chs_ucolor = np.int32([135 ,125 ,130]) # 棋子的颜色阈值上界 chess color upper - self.chs_mask = None # 棋子的罩层 - self.chs_rect = None # 棋子所在的矩形区域 - self.chs_fposi = None # 棋子底部中心的位置 chess foot position - - # 盒子 - self.box_max_width = 125 - self.box_max_height = 125 # 盒子的最大高度 - self.box_mask = None # 盒子的罩层 - self.nbox_contour = None # - self.nbox_rect = None # 下一跳盒子的位置 - self.nbox_center = None # 下一跳盒子顶部的中心 - self.distance = None - self.box_inver = None - - # 计算图像背景罩层 - self.cal_background_mask() - # 获取阴影部分的罩层 - self.cal_shadow_mask() - # 获取盒子的罩层 - self.cal_box_mask() - # 将盒子的罩层与原图像进行运算, 获取不带背景与阴影的图片 - self.make_img_without_bg() - # 计算棋子的罩层, 颜色阈值是提前设定好的. - self.cal_chs_mask() - # 计算棋子底部的位置 - self.cal_chess_foot_posi() - # 获取最顶层盒子的中心 - self.cal_top_box_center() - # 获取棋子与下一跳盒子的距离 - self.cal_distance() - - - def cal_background_mask(self): - ''' - 计算图像背景罩层 - ''' - - # 采集图像顶部 高度为100像素点的区域,对背景颜色进行统计 - # 你也可以根据你的画面自行修改 - - bg_sample = self.img[200:400, 0:200] - - # 分析背景样本图片, 得到背景颜色的阈值 - (self.bg_lcolor, self.bg_ucolor) = vutils.cal_rgb_margin(bg_sample) - - # 因为摄像头采集的时候, 光照分布, 导致图片不同区域的背景颜色差异. - # 背景色以顶部为准, 并适当放大一下背景色的取值范围, 我们这里取20 - self.bg_lcolor = vutils.justify_rgb_value(self.bg_lcolor - 20) - self.bg_ucolor = vutils.justify_rgb_value(self.bg_ucolor + 20) - # 获取背景罩层 - self.bg_mask = cv2.inRange(self.img, self.bg_lcolor, self.bg_ucolor) - # 对背景罩层进行处理 数学形态学运算, 去除噪声 - # 用7*7 的核对背景图片进行闭运算 - kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(7, 7)) - self.bg_mask = cv2.morphologyEx(self.bg_mask, cv2.MORPH_CLOSE, kernel) - - def cal_shadow_mask(self): - ''' - 获取阴影部分的罩层 - ''' - # 根据颜色的统计分布 阴影部分的颜色取值 - # 实际是背景颜色的平移, 所以我们在背景色的阈值上, 左移 - self.shd_lcolor = vutils.justify_rgb_value(self.bg_lcolor - 60) - self.shd_ucolor = vutils.justify_rgb_value(self.bg_ucolor - 50) - # 获取阴影的罩层 - self.shd_mask = cv2.inRange(self.img, self.shd_lcolor, self.shd_ucolor) - # 对获取的阴影罩层进行数学形态运算, 去除噪声 - # 使用 9*9的核进行闭运算 - kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(9, 9)) - # open close - self.shd_mask = cv2.morphologyEx(self.shd_mask, cv2.MORPH_OPEN, kernel) - - def cal_box_mask(self): - ''' - 获取盒子的罩层 - 盒子的罩层在背景罩层与阴影罩层的 二进制运算的基础上求得 - ''' - self.box_inver = cv2.bitwise_or(self.bg_mask, self.shd_mask) - self.box_mask = cv2.bitwise_not(cv2.bitwise_or(self.bg_mask, self.shd_mask)) - # 闭运算 去除噪声 - k1 = cv2.getStructuringElement(cv2.MORPH_RECT,(6, 6)) - self.box_mask = cv2.morphologyEx(self.box_mask, cv2.MORPH_CLOSE, k1) - - - - def make_img_without_bg(self): - ''' - 将盒子的罩层与原图像进行运算, 获取不带背景与阴影的图片 - ''' - self.img_nobg = cv2.bitwise_and(self.img, self.img, mask=self.box_mask) - - def cal_chs_mask(self): - ''' - 计算棋子的罩层, 颜色阈值是提前设定好的. - ''' - hsv_img = cv2.cvtColor(self.img,cv2.COLOR_BGR2HSV) - self.chs_mask = cv2.inRange(hsv_img, self.chs_lcolor, self.chs_ucolor) - - - #开运算 clean the noise - kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(8, 8)) - self.chs_mask = cv2.morphologyEx(self.chs_mask, cv2.MORPH_OPEN, kernel) - - #闭运算 make liantong - kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(8, 8)) - self.chs_mask = cv2.morphologyEx(self.chs_mask, cv2.MORPH_CLOSE, kernel) - - - def cal_chess_foot_posi(self): - ''' - 计算棋子底部的位置 - ''' - # 寻找当前棋子所处的矩形区域 (联通域) - (x,y,w,h) = cv2.boundingRect(self.chs_mask) - # 记录棋子所在的矩形区域 - self.chs_rect = (x, y, w, h) - self.chs_fposi = (int(x+w/2), y+h) - - def cal_top_box_center(self): - ''' - 获取最顶层盒子的中心 - ''' - - canvas = np.copy(self.img) - - image, contours, hier = cv2.findContours(self.box_mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) - - contours = vutils.contours_filter(contours, minHeight=50, minWidth=50) - - boxes = [] - - - for c in contours: - x, y, w, h = cv2.boundingRect(c) - boxes.append((x, y, w, h)) - - top_box = boxes[0] - top_contour = contours[0] - - for i in range(1, len(contours)): - # 对比box的y坐标的值, 获取最小 也就是最靠上方的盒子 - box = boxes[i] - if top_box[1] > box[1]: - top_box = box - top_contour = contours[i] - - # print("box : {}".format(top_box)) - - (x, y, w, h) = top_box - - # 这里有个问题, 如果两个box离的很近 - # 当前的盒子跟下一跳的盒子的区域会联通, 所以需要裁减 - # 通过判断chess是否在box中, 来判断是否相邻的两个盒子被当成一个。 - if vutils.isPointInRectangle(top_box, self.chs_fposi): - # 检测到盒子连体, 采用备用方案, 获取下一个盒子的中心。 - - miny = 100000 - ptop = None - for points in top_contour: - (px, py) = points[0] - if py < miny: - miny = py - ptop = (px, py) - # 把最顶上的坐标中x点作为box中心点。 - cx = ptop[0] - dh = int(abs(cx - self.chs_fposi[0]) / math.sqrt(3)) - cy = self.chs_fposi[1] - dh - - radius = abs(cy - ptop[1]) - - (x, y, w, h) = (cx - radius, ptop[1], 2*radius, 2*radius) - - # 再次判断chess底部是否落在矩形区域内 - # 进行对应的放缩 - # 下面的这段代码纯属靠凡哥发挥 实验有效。 - if vutils.isPointInRectangle((x, y, w, h), self.chs_fposi): - # 这里移动值, 我选的是chess矩形区域的宽度 - delta = self.chs_rect[2] - if self.chs_fposi[0] < x: - x -= delta - else: - x += delta - w -= delta - h -= delta - self.nbox_rect = (x, y, w, h) - - # 重新调整中心 - self.nbox_center = (int(x + w / 2), int(y + h / 3)) - - else: - self.nbox_rect = (x, y, w, h) - (x, y, w, h) = self.nbox_rect - # 计算中心点, 立体盒子的高的1/3处大概就是中心点y坐标的位置 - # 中心点的x左边标定为宽度的1/2处. - self.nbox_center = (int(x + w / 2), int(y + h / 3)) - (x22,y22,w22,h22) = self.nbox_rect - x33,y33 = self.chs_fposi - x44,y44 = self.nbox_center - cv2.rectangle(canvas,(x22,y22),(x22+w22,y22+h22),(255,0,0),5) - cv2.circle(canvas,(x33,y33),5,(0,0,255),-1) - cv2.circle(canvas,(x44,y44),5,(0,0,255),-1) - cv2.imshow('canvas',canvas) - - def cal_distance(self): - ''' - 获取棋子与下一跳盒子的距离 - ''' - (x1, y1) = self.chs_fposi - (x2, y2) = self.nbox_center - - self.distance = math.sqrt(math.pow((x2 - x1), 2) + math.pow((y2 - y1), 2)) - - def cal_delay(self): - ratio = 1.53 - # 事件必须是整数类型 - return int(self.distance * ratio) - - def visualization(self): - ''' - 可视化 计算过程. - ''' - - # 选择字体 - font = cv2.FONT_HERSHEY_SIMPLEX - fontScale = 0.5 - # 创建画布 - canvas = np.copy(self.img) - - # 绘制棋子所在的矩形 - (x, y, w, h) = self.chs_rect - cv2.rectangle(img=canvas, pt1=(x, y), pt2=(x + w, y + h), color=(0, 255, 0), thickness=2) - # 绘制棋子底部的中心点 红色实心 - cv2.circle(img=canvas, center=self.chs_fposi, radius=5, color=(0, 0, 255), thickness=-1) - # 标注棋子坐标 - (x, y) = self.chs_fposi - cv2.putText(canvas, text='(x={},y={})'.format(x, y), org=(x-40, y+20), fontFace=font, fontScale=fontScale, thickness=1, - lineType=cv2.LINE_AA, color=(0, 0, 255)) - - # 绘制最顶部的盒子 - (x, y, w, h) = self.nbox_rect - cv2.rectangle(img=canvas, pt1=(x, y), pt2=(x + w, y + h), color=(255, 0, 0), thickness=2) - # 绘制盒子顶部的中心点 - cv2.circle(img=canvas, center=self.nbox_center, radius=5, color=(0, 0, 255), thickness=-1) - cv2.putText(canvas, text='W={},H={}'.format(w, h), org=(20, 40), fontFace=font, fontScale=fontScale, thickness=1, - lineType=cv2.LINE_AA, color=(0, 0, 255)) - - # 标注盒子中心点坐标 - (x, y) = self.nbox_center - cv2.putText(canvas, text='(x={},y={})'.format(x, y), org=(x-20, y-20), fontFace=font, fontScale=fontScale, thickness=1, - lineType=cv2.LINE_AA, color=(0, 0, 255)) - - - # 在棋子跟盒子中心点之间绘制一条直线 - cv2.line(canvas, pt1=self.chs_fposi, pt2=self.nbox_center, color=(0, 0, 255)) - # 标注距离 - cv2.putText(canvas, text='DIS: %.3f'%(self.distance), org=(20, 20), fontFace=font, fontScale=fontScale, thickness=1, - lineType=cv2.LINE_AA, color=(0, 0, 255)) - - return canvas - - - def visualization_detail(self): - ''' - 展示计算过程中的流程, 方便排错 - - 需要统一颜色通道, 才能将其合并 作为一幅图片展示 - ''' - - output = self.visualization() - bg_mask = cv2.cvtColor(self.bg_mask, cv2.COLOR_GRAY2BGR) - shd_mask = cv2.cvtColor(self.shd_mask, cv2.COLOR_GRAY2BGR) - box_mask = cv2.cvtColor(self.box_mask, cv2.COLOR_GRAY2BGR) - chs_mask = cv2.cvtColor(self.chs_mask, cv2.COLOR_GRAY2BGR) - return np.hstack((output, bg_mask, shd_mask, box_mask, self.img_nobg, chs_mask)) - - -if __name__ == '__main__': - - - img = cv2.imread('53.png',-1) - liang = liangmaster(img) - liang.cal_chs_mask() - liang.cal_background_mask() - liang.cal_box_mask() - liang.cal_top_box_center() - liang.make_img_without_bg() - liang.cal_chess_foot_posi() - liang.cal_top_box_center - liang.cal_shadow_mask() - #c = liang.cal_distance() - #cv2.imshow('distance',c) - cv2.imshow('box_mask',liang.box_mask) - cv2.imshow('bg_mask',liang.bg_mask) - cv2.imshow('sd_mask',liang.shd_mask) - cv2.imshow('chess_mask',liang.chs_mask) - - #cv2.imshow('chess_mask',liang.chs_mask) - #cv2.imshow('img_nobg',liang.img_nobg) - - - - cv2.waitKey(0) - - cv2.destroyAllWindows() \ No newline at end of file diff --git a/process/main.py b/process/main.py deleted file mode 100755 index f502491..0000000 --- a/process/main.py +++ /dev/null @@ -1,129 +0,0 @@ -# -*- coding: utf-8 -*- -from FGJumperMaster import FGJumperMaster -from ADBHelper import ADBHelper -from FGVisonUtil import FGVisionUtil as vutil -import cv2 -import numpy as np -import time -import datetime - -# 初次读入图片 -img = ADBHelper.getScreenShotByADB() -vutil.printImgInfo(img) - -adb = ADBHelper(1080, 1920) - -cv2.namedWindow('image', flags= cv2.WINDOW_NORMAL | cv2.WINDOW_FREERATIO) - -keyPressed = -1 - - -def distance2time(distance): - ratio = 1.53 - # 事件必须是整数类型 - return int(distance * ratio) - - -def saveSampleImg(jmaster, img, tag=True): - img_name = f"{datetime.datetime.now():%Y-%m-%d-%H-%M-%S.png}" - - if tag: - cv2.imwrite("./samples/right/"+img_name, img) - cv2.imwrite("./samples/right_log/"+img_name, jmaster.visualization_detail()) - else: - cv2.imwrite("./samples/wrong/"+img_name, img) - cv2.imwrite("./samples/wrong_log/"+img_name, jmaster.visualization_detail()) - -markflag = 0 -chessPtr = (0, 0) -boxPtr = (0, 0) -isMarked = False - -''' -手动标注 - -''' -def markChessAndBoxByHand(event,x,y,flags,param): - global markflag - global chessPtr - global boxPtr - global isMarked - global subImg - - if event == cv2.EVENT_LBUTTONDOWN: - - if markflag == 0 and isMarked == False: - # 开始标注chess - # 更新chess的坐标 - - chessPtr = (x, y) - print("已标注 chess坐标 {}, {}".format(chessPtr[0], chessPtr[1])) - cv2.circle(subImg,(x,y), int(5), (0, 0, 255), -1) - markflag = 1 - elif markflag == 1 and isMarked == False: - boxPtr = (x, y) - print("已标注 box中心坐标 {}, {}".format(boxPtr[0], boxPtr[1])) - cv2.circle(subImg,(x,y), int(5), (255, 0, 0), -1) - markflag = 2 - - elif event == cv2.EVENT_LBUTTONUP and markflag == 2: - # 检测到鼠标左键抬起 - isMarked = True - markflag = 0 - # 更新图片 - cv2.imshow("image", subImg) - - -# 设置鼠标事件回调 -cv2.setMouseCallback('image',markChessAndBoxByHand) - -subImg = None -while True: - img = ADBHelper.getScreenShotByADB() - - subImg = img[300:1720, :] - - try: - jmaster = FGJumperMaster(subImg) - # 预览算法效果与过程 - subImg = jmaster.visualization() - cv2.imshow("image",jmaster.visualization()) - except IndexError: - - cv2.imshow("image", subImg) - - - keyPressed = cv2.waitKey(0) - if keyPressed == ord("e"): - print("游戏结束") - break - elif keyPressed == ord("y"): - - if isMarked: - saveSampleImg(jmaster, img, tag=False) - isMarked = False - markflag = 0 - distance = vutil.cal_distance(chessPtr, boxPtr) - print("手动distance %.2f"%distance) - delay = distance2time(distance) - rc = ADBHelper.pressOnScreen((500, 500), delay=delay) - if rc: - print("成功点击 并延时 1s") - time.sleep(0.5 + delay / 1000) - - continue - # 识别正确,确认点击 - delay = distance2time(jmaster.distance) - rc = ADBHelper.pressOnScreen((500, 500), delay=delay) - saveSampleImg(jmaster, img) - if rc: - print("成功点击 并延时 1s") - time.sleep(0.5 + delay / 1000) - - elif keyPressed == ord("n"): - # 保存失败样例及日志 - saveSampleImg(jmaster, img, tag=False) - - isMarked = False - markflag = 0 -cv2.destroyAllWindows() \ No newline at end of file diff --git a/process/markSampleLabelFormFile.py b/process/markSampleLabelFormFile.py deleted file mode 100755 index 217ebdf..0000000 --- a/process/markSampleLabelFormFile.py +++ /dev/null @@ -1,103 +0,0 @@ -''' - 测试从文件中读取图片并标注 保存标注文件 -''' -import cv2 -import numpy -from SampleLabel import SampleLabel -from glob import glob -import os - -# 标注图片保存路径 -save_path = "./samples/label/" -# 标注文件保存路径 -label_filename = "./samples/label/labels.txt" - -# 创建SampleLabel对象 -slabel = SampleLabel(save_path, label_filename) - -# 获取图片列表 -img_path_list = glob('samples/unlabel/*.png') -# 生成迭代器 -img_path_iter = iter(img_path_list) - -def getImgName(img_path): - ''' - 从路径名称中提取文件名 - ''' - # 'samples/unlabel/2018-01-25-22-19-42.png' -> '2018-01-25-22-19-42.png' - return img_path.split('/')[-1] - -def nextImg(img_path_iter, slabel): - ''' - 使用迭代器, 遍历数组 - ''' - try: - # 迭代器 下一个路径 - img_path = next(img_path_iter) - # 提取文件名称 - img_name = getImgName(img_path) - print("迭代至图片") - print(img_path) - - img = cv2.imread(img_path) - # 确认图片是否成功读入 这里一定要用is判断 而不可以使用== - if img is None: - return False - else: - slabel.updateImg(img, img_name=img_name) - - # 读入就将原来 unlabel的文件删除 - os.remove(img_path) - return True - except StopIteration: - print("遍历结束") - return False - -# 初始读入第一个 -nextImg(img_path_iter, slabel) -while True: - keyValue = cv2.waitKey(0) - # slabel.responseToKeyEvent(k, img=img) - - if keyValue == ord('e'): - print('销毁窗口并保存') - slabel.onDestroy() - break - - elif keyValue == ord('n'): - print("跳过,下一张图片(放弃当前图片)") - if not nextImg(img_path_iter, slabel): - # 如果获取失败, 退出 - break - - elif keyValue == ord('c'): - print("取消标注") - # update frame - slabel.updateImg(slabel.img) - - elif keyValue == ord('s'): - print("保存") - if slabel.isMarkDone(): - slabel.saveImg() - slabel.saveLabelInfo() - slabel.printProcessOnCanvas("Save Done") - - # 自动载入下一张图片 - if not nextImg(img_path_iter, slabel): - # 如果获取失败, 退出 - break - else: - # 标注未完成, 无法保存 - slabel.printProcessOnCanvas("Error: mark undone, could not save") - - elif keyValue == ord('h'): - - print(''' - 标注工具-帮助菜单 - ================================== - 键盘 n - next 下一张图片 (放弃当前图片) - 键盘 c - cancel 撤销标注 - 键盘 s - save 保存 - 键盘 h - help 帮助菜单 - 键盘 e - exit 保存标记并退出系统 - ''') diff --git a/process/markSampleLabelFromPhone.py b/process/markSampleLabelFromPhone.py deleted file mode 100755 index 75a1d9d..0000000 --- a/process/markSampleLabelFromPhone.py +++ /dev/null @@ -1,122 +0,0 @@ -''' -程序说明: - 从ADB中读取手机截图,并通过鼠标标注点, 保存标注文件 -''' -import cv2 -import numpy -import math -import os - -# 样本标注 -from SampleLabel import SampleLabel -# 凡哥写的ADBHelper类 -from ADBHelper import ADBHelper - - -# 图片保存路径 使用前先创建此文件夹/更新此参数 -save_path = "./samples/label/" -# 样本标注信息文件名 使用前先创建此文件/更新此参数 -label_filename = "./samples/label/labels.txt" - - -slabel = SampleLabel(save_path, label_filename) - -# 初始化 ADBHelper, 填入手机屏幕宽度跟高度. -adb = ADBHelper(1080, 1920) - - -# 将距离转换成时间 -def distance2time(distance): - ratio = 1.53 - # 时间必须是整数类型 - return int(distance * ratio) - -# 计算两点之间的距离 -def cal_distance(pt1, pt2): - ''' - 获取棋子与下一跳盒子的距离 - ''' - (x1, y1) = pt1 - (x2, y2) = pt2 - return math.sqrt(math.pow((x2 - x1), 2) + math.pow((y2 - y1), 2)) - -# 更新下一张图片 从ADB读入 -def nextImg(slabel): - ''' - 使用迭代器, 遍历数组 - ''' - global adb - try: - # 从ADB读入图片 - img = adb.getScreenShotByADB() - # 确认图片是否成功读入 - if img is None: - return False - else: - slabel.updateImg(img, img_name=None) - - # 读入就将原来 unlabel的文件删除 - return True - except StopIteration: - print("遍历结束") - return False - -# 初始读入第一个 -nextImg(slabel) -while True: - keyValue = cv2.waitKey(0) - # slabel.responseToKeyEvent(k, img=img) - - if keyValue == ord('e'): - print('销毁窗口并保存') - # 关闭窗口 - slabel.onDestroy() - break - - elif keyValue == ord('n'): - print("跳过,下一张图片") - if not nextImg(slabel): - # 如果获取失败, 退出 - break - elif keyValue == ord('c'): - print("取消标注") - # update frame - slabel.updateImg(slabel.img) - - elif keyValue == ord('s'): - print("保存") - if slabel.isMarkDone(): - # 保存样本 - slabel.saveImg() - # 保存样本标注信息 - slabel.saveLabelInfo() - # 显示提示信息 : 保存完成 - slabel.printProcessOnCanvas("Save Done") - # 随机点击屏幕, 设置对应的延时时间. - delay_time = distance2time(cal_distance(slabel.cbox, slabel.fchess)) - - # 这里可以添加个延时 - # TODO - - adb.randPressOnScreen(delay_time) - - # 显示提示信息 : 自动载入下一张图片 - if not nextImg(slabel): - # 如果获取失败, 退出 - break - else: - # 标注未完成, 无法保存 - slabel.printProcessOnCanvas("Error: mark undone, could not save") - - - elif keyValue == ord('h'): - - print(''' - 标注工具-帮助菜单 - ================================== - 键盘 n - next 下一张图片 需要手动更新!!! - 键盘 c - cancel 撤销标注 - 键盘 s - save 保存样本标注与跳跃 - 键盘 h - help 帮助菜单 - 键盘 e - exit 保存标记并退出系统 - ''') \ No newline at end of file diff --git a/process/mask.png b/process/mask.png deleted file mode 100644 index 6c3bc0d..0000000 Binary files a/process/mask.png and /dev/null differ diff --git a/process/meisi.png b/process/meisi.png deleted file mode 100644 index 5b35bb4..0000000 Binary files a/process/meisi.png and /dev/null differ diff --git a/process/rectangle.png b/process/rectangle.png deleted file mode 100644 index 745fd96..0000000 Binary files a/process/rectangle.png and /dev/null differ diff --git a/process/text.png b/process/text.png deleted file mode 100644 index b893d0c..0000000 Binary files a/process/text.png and /dev/null differ diff --git a/process/text.py b/process/text.py deleted file mode 100644 index aee9e40..0000000 --- a/process/text.py +++ /dev/null @@ -1,13 +0,0 @@ -import cv2 as cv -import numpy as np - - -img = cv.imread('41.png',-1) - - -cv.rectangle(img,(20,20),(150,150),(255,25,25),5) - - -cv.imwrite('41resave.png',img) -cv.waitKey(0) -cv.destroyAllWindows() \ No newline at end of file diff --git a/process/variable.py b/process/variable.py deleted file mode 100644 index 393f1f1..0000000 --- a/process/variable.py +++ /dev/null @@ -1,18 +0,0 @@ -import cv2 as cv - - - - - - - - - - - - - - - -if __name__ == '__main__': - pass