├── README.md ├── box.csv ├── drawbox.py └── image ├── pose 1.png ├── pose 2.png ├── pose 3.png └── wombat ├── wombat-2.jpg └── wombat.jpg /README.md: -------------------------------------------------------------------------------- 1 | # detect_object 2 | 3 | On development. 4 | For now it's just a tool that help you to define bounding boxes. 5 | -------------------------------------------------------------------------------- /box.csv: -------------------------------------------------------------------------------- 1 | 2 | pose 1.png,830,81,1185,396 3 | pose 2.png,460,49,800,408 4 | pose 2.png,790,175,1017,555 5 | pose 2.png,1056,451,1290,669 6 | pose 3.png,440,53,897,385 7 | -------------------------------------------------------------------------------- /drawbox.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | 3 | import tkinter as tk 4 | import numpy as np 5 | from PIL import Image, ImageTk 6 | import os 7 | 8 | 9 | try: 10 | # Python 2 11 | xrange 12 | except NameError: 13 | # Python 3, xrange is now named range 14 | xrange = range 15 | 16 | 17 | 18 | 19 | #setting 20 | wCanvas = 1366 21 | hCanvas = 700 22 | datasave = 'box.csv' 23 | dirimg = 'image/wombat' 24 | 25 | 26 | class BoundingBox(tk.Tk): 27 | def __init__(self): 28 | tk.Tk.__init__(self) 29 | self.x = self.y = 0 30 | self.canvas = tk.Canvas(self, width=wCanvas, height=hCanvas, cursor="cross") 31 | 32 | 33 | self.canvas.pack(side="top", fill="both", expand=True) 34 | self.canvas.config(scrollregion=self.canvas.bbox(tk.ALL)) 35 | self.canvas.bind("", self.on_button_press) 36 | self.canvas.bind("", self.on_move_press) 37 | self.canvas.bind("", self.on_button_release) 38 | 39 | self.canvas.focus_set() 40 | self.canvas.bind("", self.previmg) 41 | self.canvas.bind("", self.nextimg) 42 | self.canvas.bind("s", self.saveboxcord) 43 | self.canvas.bind("d", self.resetbox) 44 | 45 | #add label of numbering 46 | self.numbering = tk.Label(self, text='0') 47 | self.numbering.pack() 48 | 49 | #open data save 50 | self.allimg = sorted(os.listdir(dirimg)) 51 | self.imgptr = 0 52 | 53 | self.boxdata = None 54 | 55 | self.allcord = [] 56 | 57 | self.allrect = [] 58 | self.rect = None 59 | 60 | self.start_x = None 61 | self.start_y = None 62 | self.end_x = None 63 | self.end_y = None 64 | self.totwidth = None 65 | self.totheight = None 66 | 67 | 68 | self._draw_image() 69 | 70 | 71 | def _draw_image(self): 72 | self.im = Image.open(dirimg+'/'+self.allimg[self.imgptr]) 73 | self.tk_im = ImageTk.PhotoImage(self.im) 74 | self.canvas.create_image(0,0,anchor="nw",image=self.tk_im) 75 | 76 | def saveboxcord(self, event): 77 | self.boxdata = open(datasave, 'a+') 78 | for i in xrange(len(self.allcord)): 79 | self.boxdata.write(self.allimg[self.imgptr]+','+ 80 | str(self.allcord[i][0])+','+ 81 | str(self.allcord[i][1])+','+ 82 | str(self.allcord[i][2])+','+ 83 | str(self.allcord[i][3])+','+ 84 | str(self.allcord[i][4])+','+ 85 | str(self.allcord[i][5])+'\n') 86 | for i in xrange(len(self.allrect)): 87 | self.canvas.delete(self.allrect[i]) 88 | del self.allcord[:] 89 | del self.allrect[:] 90 | self.boxdata.close() 91 | self.numbering.configure(text="box saved") 92 | 93 | def resetbox(self, event): 94 | for i in xrange(len(self.allrect)): 95 | self.canvas.delete(self.allrect[i]) 96 | del self.allcord[:] 97 | del self.allrect[:] 98 | self.numbering.configure(text="box reset") 99 | 100 | def nextimg(self, event): 101 | for i in xrange(len(self.allrect)): 102 | self.canvas.delete(self.allrect[i]) 103 | del self.allcord[:] 104 | del self.allrect[:] 105 | self.canvas.delete("all") 106 | 107 | self.imgptr += 1 108 | if self.imgptr > len(self.allimg)-1: 109 | self.imgptr = 0 110 | self._draw_image() 111 | self.numbering.configure(text=str(self.imgptr)) 112 | 113 | def previmg(self, event): 114 | for i in xrange(len(self.allrect)): 115 | self.canvas.delete(self.allrect[i]) 116 | del self.allcord[:] 117 | del self.allrect[:] 118 | self.canvas.delete("all") 119 | 120 | self.imgptr -= 1 121 | if self.imgptr < 0: 122 | self.imgptr = len(self.allimg)-1 123 | self._draw_image() 124 | self.numbering.configure(text=str(self.imgptr)) 125 | 126 | 127 | def on_button_press(self, event): 128 | # save mouse drag start position 129 | self.start_x = event.x 130 | self.start_y = event.y 131 | 132 | # create rectangle if not yet exist 133 | #if not self.rect: 134 | self.rect = self.canvas.create_rectangle(self.x, self.y, 1, 1, outline='green', width=3) 135 | 136 | def on_move_press(self, event): 137 | curX, curY = (event.x, event.y) 138 | 139 | if curX > wCanvas: 140 | curX = wCanvas 141 | if curY > hCanvas: 142 | curY = hCanvas 143 | 144 | self.end_x = curX 145 | self.end_y = curY 146 | 147 | # expand rectangle as you drag the mouse 148 | self.canvas.coords(self.rect, self.start_x, self.start_y, curX, curY) 149 | 150 | 151 | 152 | def on_button_release(self, event): 153 | self.imarray = np.array(self.im) 154 | self.totwidth = len(self.imarray) 155 | self.totheight = len(self.imarray[0]) 156 | print(self.start_x, self.start_y, self.end_x, self.end_y, self.totwidth, self.totheight) 157 | self.allcord.append([self.start_x, self.start_y, self.end_x, self.end_y, self.totwidth, self.totheight]) 158 | self.allrect.append(self.rect) 159 | print (len(self.allcord)) 160 | 161 | 162 | if __name__ == "__main__": 163 | draw = BoundingBox() 164 | draw.mainloop() 165 | -------------------------------------------------------------------------------- /image/pose 1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/genomexyz/detect_object/b957aeb6ed7c2af16933fcbba01d1ff83bbd6b48/image/pose 1.png -------------------------------------------------------------------------------- /image/pose 2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/genomexyz/detect_object/b957aeb6ed7c2af16933fcbba01d1ff83bbd6b48/image/pose 2.png -------------------------------------------------------------------------------- /image/pose 3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/genomexyz/detect_object/b957aeb6ed7c2af16933fcbba01d1ff83bbd6b48/image/pose 3.png -------------------------------------------------------------------------------- /image/wombat/wombat-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/genomexyz/detect_object/b957aeb6ed7c2af16933fcbba01d1ff83bbd6b48/image/wombat/wombat-2.jpg -------------------------------------------------------------------------------- /image/wombat/wombat.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/genomexyz/detect_object/b957aeb6ed7c2af16933fcbba01d1ff83bbd6b48/image/wombat/wombat.jpg --------------------------------------------------------------------------------