├── README.md ├── Red-Bottle-Counter.ipynb └── video.mp4 /README.md: -------------------------------------------------------------------------------- 1 | # Red-Color-Bottle-Detection -------------------------------------------------------------------------------- /Red-Bottle-Counter.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "id": "89233813", 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": "b0ea65ee", 18 | "metadata": {}, 19 | "outputs": [], 20 | "source": [ 21 | "\n", 22 | "# Kullanacağımız videonun adresini yazıyoruz. Webcam için 0 yazıyoruz\n", 23 | "kamera= cv2.VideoCapture('video.mp4')\n", 24 | "\n", 25 | "# Yazı fontunu tanımlıyoruz.\n", 26 | "font = cv2.FONT_HERSHEY_DUPLEX\n", 27 | "\n", 28 | "# Her rengin yer aldığı bir HSV değer aralığı var.\n", 29 | "# Kırmızı renk için bu değerleri tanımlıyoruz.\n", 30 | "low_red = np.array([170, 70, 50])\n", 31 | "high_red = np.array([180, 255, 255])\n", 32 | "\n", 33 | "# Toplam kaç şişenin geçtiğini tutacağımız değişken\n", 34 | "count=0\n", 35 | "\n", 36 | "# Şişenin geçip geçmediğini kontrol edeceğimiz değişken\n", 37 | "control=False\n", 38 | "\n", 39 | "while True:\n", 40 | " \n", 41 | " \n", 42 | " \n", 43 | " # Kameradan gelen görüntüyü alıyoruz.\n", 44 | " # Kameradan gelen görüntü biterse ret False olur\n", 45 | " ret,frame=kamera.read()\n", 46 | " if not ret:\n", 47 | " break\n", 48 | " \n", 49 | " # Gelen görüntüyü HSV renk uzayına çeviriyoruz.\n", 50 | " hsv_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)\n", 51 | " \n", 52 | "\n", 53 | "\n", 54 | " # Görüntüye bir filtreleme uyguluyoruz. Kırmızı renk değerlerini kullandığımız için görüntüde kırmızı olan yerler beyaz\n", 55 | " # geri kalan renklere sahip pikseller siyah oldu.\n", 56 | " # Bizim sayacağımız şişeler kırımızı renkte olduğu için böyle bir şey yaptık. Buradaki beyaz alanlar kırmızı şişeler olacak\n", 57 | " mask = cv2.inRange(hsv_frame, low_red, high_red)\n", 58 | " \n", 59 | " # Maskeye erezyon, aşındırma işlemi uyguluyoruz. Böylece beyaz kısımlar daha keskinleşmiş oluyor.\n", 60 | " mask = cv2.erode(mask,None,iterations=2)\n", 61 | " \n", 62 | " # Maskeye blur işlemi uyguluyoruz\n", 63 | " mask = cv2.GaussianBlur(mask, (3, 3), 0)\n", 64 | " \n", 65 | " # Maskedeki beyaz olan yerleri koordinatlarını buluyrouz.\n", 66 | " cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]\n", 67 | " \n", 68 | " #Burada yukarıdan aşağıya bir çizgi çekiyoruz. Bu çizgi görsel amaçlı kullanılıyor.\n", 69 | " # Şişelerin nereden geeçtikten sonra geçti kabul edildiğini biz beliyoryoruz.\n", 70 | " # O yüzden bu koordinatlar aşağıdaki koordinatlar ile uyumlu olmalı.\n", 71 | " # Burada benim belirdiğim çizgi yatayda 700. piksel. \n", 72 | " cv2.line(frame,(700,0),(700,720),(255,0,0), 10)\n", 73 | " \n", 74 | " # Burada her bir alan için konumlara bakıyoruz.\n", 75 | " for cnt in cnts:\n", 76 | " \n", 77 | " # Burada alanın konumunu dikdörtgen formatta aldık.\n", 78 | " # x ve y sol üst köşe w dikdörtgenin genişliği h ise yüksekliği\n", 79 | " (x, y, w, h) = cv2.boundingRect(cnt)\n", 80 | " \n", 81 | " # Çok küçük kırmızı alanları göz ardı etmek için belirli büyüklükteki alanları dikkate alıyoruz\n", 82 | " if w>100 and h>200 :\n", 83 | "\n", 84 | " # alanın yani şişenin orta noktaları\n", 85 | " cx=int(x+w/2)\n", 86 | " cy=int(y+h/2)\n", 87 | " \n", 88 | " # Şişenin geçip geçmediğini kontrol etmek için görsel üzerinden bir bölge seçiyoruz\n", 89 | " # Ben 700. pikselde bakacağım için bölge olarak bu noktadan 50 geri ve 50 ileri şeklinde bir bölge seçtim\n", 90 | " # Şişenin orta noktası bu bölgeye gelmişse geçilip geçilmediği için kontrole alınacak\n", 91 | " if cx>650 and cx<750:\n", 92 | " \n", 93 | " # Eğer şişe bölgenin içinde ise geçiş noktasının solunda mı diye kontrol ediyoruz.\n", 94 | " # Eğer böyle bir kontrol yapmazsak şişenin orta noktası birden fazla bu bölgeye girdiği için \n", 95 | " # bir şişe birden fazla sayılacaktır. \n", 96 | " # Şişe eğer geçiş noktasının solunda ise control değişkenini True yapıyrouz.\n", 97 | " if cx<700:\n", 98 | " control=True\n", 99 | " \n", 100 | " # Şişe geçiş noktasının sağında mı diye bakıyoruz.Ayrıcca control değişkenine da bakıyoruz.\n", 101 | " # Eğer sağında ise ve control True ise şişeyi geçti kabul edip count değişkenini 1 arttıryoruz.\n", 102 | " # Ayrıca control değişkenini false yapıyoruz.\n", 103 | " # Böylece bir sonraki kısımda hala sağında olsa bile bu if bloğunun içine girlmeyeceği için\n", 104 | " # bir şişe sadece bir kere sayılacak\n", 105 | " if cx>700 and control:\n", 106 | " control=False\n", 107 | " count+=1\n", 108 | " \n", 109 | " # Geçiş esnasında çizginin rengini sarı yapıyoruz.\n", 110 | " cv2.line(frame,(700,0),(700,720),(0,255,255), 10)\n", 111 | " \n", 112 | " \n", 113 | " # Şişe bölgede iken orta noktasını beyaz bir daire gösteriyoruz.\n", 114 | " cv2.circle(frame,(cx,cy),20,(255,255,255),-1)\n", 115 | " \n", 116 | " # Toplam kaç şişe geçtiğini ekranda gösteriyoruz\n", 117 | " strcount= \"Toplam: \"+str(count)\n", 118 | " cv2.putText(frame,strcount ,(0, 60), font, 2, (102,0,153), 2) \n", 119 | " \n", 120 | " \n", 121 | " cv2.imshow(\"kamera\",frame)\n", 122 | " \n", 123 | "\n", 124 | " if cv2.waitKey(1) & 0xFF == ord('q'):\n", 125 | " break\n", 126 | "\n", 127 | "kamera.release() \n", 128 | "cv2.destroyAllWindows()" 129 | ] 130 | }, 131 | { 132 | "cell_type": "markdown", 133 | "id": "0fa4c389", 134 | "metadata": {}, 135 | "source": [ 136 | "Kodun yorum satırları olmayan hali" 137 | ] 138 | }, 139 | { 140 | "cell_type": "code", 141 | "execution_count": 3, 142 | "id": "c92649ce", 143 | "metadata": {}, 144 | "outputs": [], 145 | "source": [ 146 | "kamera= cv2.VideoCapture('video.mp4')\n", 147 | "font = cv2.FONT_HERSHEY_DUPLEX\n", 148 | "\n", 149 | "low_red = np.array([170, 70, 50])\n", 150 | "high_red = np.array([180, 255, 255])\n", 151 | "count=0\n", 152 | "control=False\n", 153 | "\n", 154 | "while True:\n", 155 | " \n", 156 | " \n", 157 | " \n", 158 | " ret,frame=kamera.read()\n", 159 | " if not ret:\n", 160 | " break\n", 161 | " \n", 162 | " hsv_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)\n", 163 | " \n", 164 | "\n", 165 | "\n", 166 | "\n", 167 | " mask = cv2.inRange(hsv_frame, low_red, high_red)\n", 168 | " mask = cv2.erode(mask,None,iterations=2)\n", 169 | " \n", 170 | " mask = cv2.GaussianBlur(mask, (3, 3), 0)\n", 171 | " cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]\n", 172 | " \n", 173 | " cv2.line(frame,(700,0),(700,720),(255,0,0), 10)\n", 174 | " for cnt in cnts:\n", 175 | " (x, y, w, h) = cv2.boundingRect(cnt)\n", 176 | " \n", 177 | " if w>100 and h>200 :\n", 178 | "\n", 179 | " \n", 180 | " cx=int(x+w/2)\n", 181 | " cy=int(y+h/2)\n", 182 | " \n", 183 | " if cx>650 and cx<750:\n", 184 | " if cx<700:\n", 185 | " control=True\n", 186 | " \n", 187 | " if cx>700 and control:\n", 188 | " control=False\n", 189 | " count+=1\n", 190 | " cv2.line(frame,(700,0),(700,720),(0,255,255), 10)\n", 191 | " \n", 192 | " \n", 193 | " \n", 194 | " cv2.circle(frame,(cx,cy),20,(255,255,255),-1)\n", 195 | " \n", 196 | " strcount= \"Toplam: \"+str(count)\n", 197 | " \n", 198 | " cv2.putText(frame,strcount ,(0, 60), font, 2, (102,0,153), 2) \n", 199 | " \n", 200 | " \n", 201 | " cv2.imshow(\"kamera\",frame)\n", 202 | " \n", 203 | "\n", 204 | " if cv2.waitKey(1) & 0xFF == ord('q'):\n", 205 | " break\n", 206 | "\n", 207 | "kamera.release() \n", 208 | "cv2.destroyAllWindows()" 209 | ] 210 | } 211 | ], 212 | "metadata": { 213 | "kernelspec": { 214 | "display_name": "Python 3 (ipykernel)", 215 | "language": "python", 216 | "name": "python3" 217 | }, 218 | "language_info": { 219 | "codemirror_mode": { 220 | "name": "ipython", 221 | "version": 3 222 | }, 223 | "file_extension": ".py", 224 | "mimetype": "text/x-python", 225 | "name": "python", 226 | "nbconvert_exporter": "python", 227 | "pygments_lexer": "ipython3", 228 | "version": "3.9.13" 229 | } 230 | }, 231 | "nbformat": 4, 232 | "nbformat_minor": 5 233 | } 234 | -------------------------------------------------------------------------------- /video.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Deepandreinforcement/Red-Color-Bottle-Detection/66707aea65e2684717b7d923e6568b283ebbffee/video.mp4 --------------------------------------------------------------------------------