├── Count-Region.ipynb ├── README.md └── people1.mp4 /Count-Region.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "id": "2a223380", 7 | "metadata": {}, 8 | "outputs": [], 9 | "source": [ 10 | "import cv2\n", 11 | "import numpy as np" 12 | ] 13 | }, 14 | { 15 | "cell_type": "code", 16 | "execution_count": 2, 17 | "id": "7f0d3273", 18 | "metadata": {}, 19 | "outputs": [], 20 | "source": [ 21 | "from ultralytics import YOLO\n", 22 | "# Kullanacağımız modeli yüklüyoruz\n", 23 | "model = YOLO(\"yolov8l.pt\")" 24 | ] 25 | }, 26 | { 27 | "cell_type": "markdown", 28 | "id": "609e370b", 29 | "metadata": {}, 30 | "source": [ 31 | "Bu fonksiyonu kullanarak mouse ile ekranda bölge (dikdörtgen) çizebiliyoruz." 32 | ] 33 | }, 34 | { 35 | "cell_type": "code", 36 | "execution_count": 3, 37 | "id": "c57f365f", 38 | "metadata": {}, 39 | "outputs": [], 40 | "source": [ 41 | "def draw_rectangle(event, x, y, flags, param):\n", 42 | " global ix, iy, drawing, frame\n", 43 | "\n", 44 | " # Mouse'a basıldığında\n", 45 | " if event == cv2.EVENT_LBUTTONDOWN:\n", 46 | " drawing = True\n", 47 | " ix, iy = x, y\n", 48 | "\n", 49 | " # Mouse hareket ederken ve basılıyken\n", 50 | " elif event == cv2.EVENT_MOUSEMOVE:\n", 51 | " if drawing:\n", 52 | " frame_copy = frame.copy()\n", 53 | " cv2.rectangle(frame_copy, (ix, iy), (x, y), (0, 255, 0), 2)\n", 54 | " cv2.imshow('Video', frame_copy)\n", 55 | "\n", 56 | " # Mouse bırakıldığında\n", 57 | " elif event == cv2.EVENT_LBUTTONUP:\n", 58 | " drawing = False\n", 59 | " rectangles.append((ix, iy, x, y)) " 60 | ] 61 | }, 62 | { 63 | "cell_type": "code", 64 | "execution_count": 6, 65 | "id": "d881e9e0", 66 | "metadata": {}, 67 | "outputs": [], 68 | "source": [ 69 | "# Çizilen dikdörtgenleri saklamak için bir liste\n", 70 | "rectangles = []\n", 71 | "\n", 72 | "# İlk durum ve koordinatları tutacak değişkenler\n", 73 | "drawing = False\n", 74 | "ix, iy = -1, -1\n", 75 | "\n", 76 | "\n", 77 | "# Kullanacağımız videoyu yüklüyoruz\n", 78 | "video = cv2.VideoCapture('people1.mp4') \n", 79 | "font = cv2.FONT_HERSHEY_SIMPLEX\n", 80 | "\n", 81 | "# Pencere oluşturuyoruz \n", 82 | "cv2.namedWindow('Video')\n", 83 | "\n", 84 | "# Bu fonksiyon mouse'a dokunulduğu zaman kendiliğinden çağrılıyor\n", 85 | "# Çağıracağımız fonksiyonun adı draw_rectangle\n", 86 | "\n", 87 | "cv2.setMouseCallback('Video', draw_rectangle)\n", 88 | "\n", 89 | "while True:\n", 90 | " ret, frame = video.read()\n", 91 | " \n", 92 | " if not ret:\n", 93 | " break\n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " # görüntü boyutunu düşürmek isterseniz\n", 98 | " # frame=cv2.resize(frame,(0,0),fx=0.5,fy=0.5)\n", 99 | " \n", 100 | " # Resmi RGB uzayına çevirip nesne tespit eden modele veriyoruz\n", 101 | " imgs=cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)\n", 102 | " results = model(imgs,verbose=False) \n", 103 | " labels=results[0].names\n", 104 | " \n", 105 | " # Burada çizilen her bölge için dönecek for dögüsü\n", 106 | " for rect in rectangles:\n", 107 | " #Bölgedeki insan sayısını bununla tutuyoruz\n", 108 | " total=0\n", 109 | " \n", 110 | " # Bölgeyi ekranda çizdiriyoruz.\n", 111 | " cv2.rectangle(frame, (rect[0], rect[1]), (rect[2], rect[3]), (0, 255, 0), 2)\n", 112 | " \n", 113 | " # Burada her bir nesne için dönecek for döngüsü\n", 114 | " \n", 115 | " for i in range(len(results[0].boxes)):\n", 116 | " x1,y1,x2,y2=results[0].boxes.xyxy[i]\n", 117 | " score=results[0].boxes.conf[i]\n", 118 | " label=results[0].boxes.cls[i]\n", 119 | " x1,y1,x2,y2,score,label=int(x1),int(y1),int(x2),int(y2),float(score),int(label)\n", 120 | " name=labels[label]\n", 121 | " \n", 122 | " \n", 123 | " # İnsan olmayan nesneleri işleme katmıyoruz\n", 124 | " if name!='person': \n", 125 | " continue\n", 126 | " \n", 127 | " # Nesnelerin orta noktası\n", 128 | " cx=int(x1/2+x2/2)\n", 129 | " cy=int(y1/2+y2/2)\n", 130 | " \n", 131 | " # Orta noktaları ekranda gösteriyoruz\n", 132 | " cv2.circle(frame,(cx,cy),5,(0,0,255),-1)\n", 133 | " \n", 134 | "\n", 135 | " \n", 136 | " # Mouse ile çizilen bölgeden koordinatları alıp uygun formata çeviriyoruz\n", 137 | " region1=np.array([(rect[0],rect[1]),(rect[2],rect[1]),(rect[2],rect[3]),(rect[0],rect[3])])\n", 138 | " region1 = region1.reshape((-1,1,2))\n", 139 | " \n", 140 | " # Nesnenin orta noktası bölgenin içinde mi diye bakıyoruz.\n", 141 | " inside_region1=cv2.pointPolygonTest(region1,(cx,cy),False)\n", 142 | " \n", 143 | " # Bölgeyi ekranda sarı renk ile gösteriyoruz\n", 144 | " cv2.polylines(frame,[region1],True,(0,255,255),5)\n", 145 | " \n", 146 | " \n", 147 | " # Eğer nesne bölgenin içinde ise bu if True döner ve bölgedeki kişi sayısı 1 artar\n", 148 | " if inside_region1>0:\n", 149 | " \n", 150 | " total+=1\n", 151 | " \n", 152 | " # Bölgenin sol üst köşesinin 10 piksel üstünde bölgedeki kişi sayısını gösteriyoruz\n", 153 | " cv2.putText(frame, str(total),(rect[0],rect[1]-10), font, 2.1, (255,0,255), 3)\n", 154 | "\n", 155 | " \n", 156 | " \n", 157 | " \n", 158 | "\n", 159 | " cv2.imshow('Video', frame)\n", 160 | " \n", 161 | "\n", 162 | " \n", 163 | " if cv2.waitKey(1) & 0xFF == ord('q'):\n", 164 | " break\n", 165 | "\n", 166 | "\n", 167 | "video.release()\n", 168 | "cv2.destroyAllWindows()" 169 | ] 170 | }, 171 | { 172 | "cell_type": "markdown", 173 | "id": "b1b97814", 174 | "metadata": {}, 175 | "source": [ 176 | "Sadece bölgeleri çizmek isterseniz aşağıdaki kodu kullanabilirsiniz. " 177 | ] 178 | }, 179 | { 180 | "cell_type": "code", 181 | "execution_count": 7, 182 | "id": "f9aedc81", 183 | "metadata": {}, 184 | "outputs": [], 185 | "source": [ 186 | "\n", 187 | "rectangles = []\n", 188 | "\n", 189 | "\n", 190 | "drawing = False\n", 191 | "ix, iy = -1, -1\n", 192 | "\n", 193 | "video = cv2.VideoCapture('people1.mp4') \n", 194 | "font = cv2.FONT_HERSHEY_SIMPLEX\n", 195 | "\n", 196 | "# Pencere oluşturuyoruz \n", 197 | "cv2.namedWindow('Video')\n", 198 | "\n", 199 | "cv2.setMouseCallback('Video', draw_rectangle)\n", 200 | "\n", 201 | "while True:\n", 202 | " ret, frame = video.read()\n", 203 | " \n", 204 | " if not ret:\n", 205 | " break\n", 206 | " \n", 207 | " \n", 208 | " \n", 209 | " # görüntü boyutunu düşürmek isterseniz\n", 210 | " # frame=cv2.resize(frame,(0,0),fx=0.5,fy=0.5)\n", 211 | "\n", 212 | " \n", 213 | " # Burada çizilen her bölge için dönecek for dögüsü\n", 214 | " for rect in rectangles:\n", 215 | " \n", 216 | " cv2.rectangle(frame, (rect[0], rect[1]), (rect[2], rect[3]), (0, 255, 0), 2)\n", 217 | " \n", 218 | "\n", 219 | " cv2.imshow('Video', frame)\n", 220 | " \n", 221 | "\n", 222 | " \n", 223 | " if cv2.waitKey(1) & 0xFF == ord('q'):\n", 224 | " break\n", 225 | "\n", 226 | "\n", 227 | "video.release()\n", 228 | "cv2.destroyAllWindows()" 229 | ] 230 | } 231 | ], 232 | "metadata": { 233 | "kernelspec": { 234 | "display_name": "Python 3 (ipykernel)", 235 | "language": "python", 236 | "name": "python3" 237 | }, 238 | "language_info": { 239 | "codemirror_mode": { 240 | "name": "ipython", 241 | "version": 3 242 | }, 243 | "file_extension": ".py", 244 | "mimetype": "text/x-python", 245 | "name": "python", 246 | "nbconvert_exporter": "python", 247 | "pygments_lexer": "ipython3", 248 | "version": "3.9.13" 249 | } 250 | }, 251 | "nbformat": 4, 252 | "nbformat_minor": 5 253 | } 254 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Python-Count-Object-Manuel-Region -------------------------------------------------------------------------------- /people1.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Deepandreinforcement/Python-Count-Object-Manuel-Region/0ff81305062c0e7236e249ed1e4176812840d3e9/people1.mp4 --------------------------------------------------------------------------------