Π¨ΠΏΠ°Ρ€Π³Π°Π»ΠΊΠ° ΠΏΠΎ OpenCV β€” Python

ОблоТка: Π¨ΠΏΠ°Ρ€Π³Π°Π»ΠΊΠ° ΠΏΠΎ OpenCV β€” Python

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ OpenCV?

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½ΠΎΠ³ΠΎ зрСния ΠΈ машинного обучСния с ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ исходным ΠΊΠΎΠ΄ΠΎΠΌ. Π’ Π½Π΅Ρ‘ входят Π±ΠΎΠ»Π΅Π΅ 2500 Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ², Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΅ΡΡ‚ΡŒ ΠΊΠ°ΠΊ классичСскиС, Ρ‚Π°ΠΊ ΠΈ соврСмСнныС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ для ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½ΠΎΠ³ΠΎ зрСния ΠΈ машинного обучСния. Π­Ρ‚Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΈΠΌΠ΅Π΅Ρ‚ интСрфСйсы Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… языках, срСди ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΅ΡΡ‚ΡŒ Python (Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π΅Π³ΠΎ), Java, C++ ΠΈ Matlab.

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

  1. Установка.
  2. Π˜ΠΌΠΏΠΎΡ€Ρ‚ ΠΈ просмотр изобраТСния.
  3. ΠžΠ±Ρ€Π΅Π·ΠΊΠ°.
  4. ИзмСнСниС Ρ€Π°Π·ΠΌΠ΅Ρ€Π°.
  5. ΠŸΠΎΠ²ΠΎΡ€ΠΎΡ‚.
  6. Градация сСрого ΠΈ ΠΏΠΎΡ€ΠΎΠ³.
  7. Π Π°Π·ΠΌΡ‹Ρ‚ΠΈΠ΅/сглаТиваниС.
  8. РисованиС ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ².
  9. РисованиС линий.
  10. ВСкст Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ.
  11. РаспознаваниС Π»ΠΈΡ†.
  12. Contours β€” распознаваниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².
  13. Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ изобраТСния.

Π˜ΠΌΠΏΠΎΡ€Ρ‚ ΠΈ просмотр изобраТСния

			import cv2
image = cv2.imread("./ΠΏΡƒΡ‚ΡŒ/ΠΊ/ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ.Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅")
cv2.imshow("Image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
		

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ ΠŸΡ€ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠΈ способом Π²Ρ‹ΡˆΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ находится Π² Ρ†Π²Π΅Ρ‚ΠΎΠ²ΠΎΠΌ пространствС Π½Π΅ RGB (ΠΊΠ°ΠΊ всС ΠΏΡ€ΠΈΠ²Ρ‹ΠΊΠ»ΠΈ), Π° BGR. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π² Π½Π°Ρ‡Π°Π»Π΅ это Π½Π΅ Ρ‚Π°ΠΊ Π²Π°ΠΆΠ½ΠΎ, Π½ΠΎ ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹ Π½Π°Ρ‡Π½Ρ‘Ρ‚Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Ρ†Π²Π΅Ρ‚ΠΎΠΌ β€” стоит Π·Π½Π°Ρ‚ΡŒ ΠΎΠ± этой особСнности. Π•ΡΡ‚ΡŒ 2 ΠΏΡƒΡ‚ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ:

  1. ΠŸΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ мСстами 1-ΠΉ ΠΊΠ°Π½Π°Π» (R β€” красный) с 3-ΠΌ ΠΊΠ°Π½Π°Π»ΠΎΠΌ (B β€” синий), ΠΈ Ρ‚ΠΎΠ³Π΄Π° красный Ρ†Π²Π΅Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ (0,0,255), Π° Π½Π΅ (255,0,0).
  2. ΠŸΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ†Π²Π΅Ρ‚ΠΎΠ²ΠΎΠ΅ пространство Π½Π° RGB:rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)И Ρ‚ΠΎΠ³Π΄Π° Π² ΠΊΠΎΠ΄Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΡƒΠΆΠ΅ Π½Π΅ с image, Π° с rgb_image.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΎΠΊΠ½ΠΎ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ отобраТаСтся ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Π½Π°ΠΆΠΌΠΈΡ‚Π΅ Π»ΡŽΠ±ΡƒΡŽ ΠΊΠ»Π°Π²ΠΈΡˆΡƒ. Если ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΡƒ закрытия ΠΎΠΊΠ½Π°, ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Ρ‚ΠΊΠ½ΡƒΡ‚ΡŒΡΡ Π½Π° подвисания.

На протяТСнии ΡΡ‚Π°Ρ‚ΡŒΠΈ для Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄:

			import cv2
def viewImage(image, name_of_window):
    cv2.namedWindow(name_of_window, cv2.WINDOW_NORMAL)
    cv2.imshow(name_of_window, image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
		

ΠšΠ°Π΄Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

			import cv2
cropped = image[10:500, 500:2000]
viewImage(cropped, "ΠŸΡ‘ΡΠΈΠΊ послС кадрирования")
		

Π“Π΄Π΅ image[10:500, 500:2000] β€” это image[y:y + высота, x:x + ΡˆΠΈΡ€ΠΈΠ½Π°].

ИзмСнСниС Ρ€Π°Π·ΠΌΠ΅Ρ€Π°

			import cv2
scale_percent = 20 # ΠŸΡ€ΠΎΡ†Π΅Π½Ρ‚ ΠΎΡ‚ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°
width = int(img.shape[1] * scale_percent / 100)
height = int(img.shape[0] * scale_percent / 100)
dim = (width, height)
resized = cv2.resize(img, dim, interpolation = cv2.INTER_AREA)
viewImage(resized, "ПослС измСнСния Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π½Π° 20 %")
		

Π­Ρ‚Π° функция ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚ ΡΠΎΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ сторон ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ изобраТСния. Π”Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ измСнСния Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ здСсь.

ΠŸΠΎΠ²ΠΎΡ€ΠΎΡ‚

			import cv2
(h, w, d) = image.shape
center = (w // 2, h // 2)
M = cv2.getRotationMatrix2D(center, 180, 1.0)
rotated = cv2.warpAffine(image, M, (w, h))
viewImage(rotated, "ΠŸΡ‘ΡΠΈΠΊ послС ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚Π° Π½Π° 180 градусов")
		

image.shape Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ высоту, ΡˆΠΈΡ€ΠΈΠ½Ρƒ ΠΈ ΠΊΠ°Π½Π°Π»Ρ‹. M β€” ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚Π° β€” ΠΏΠΎΠ²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅Ρ‚ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° 180 градусов Π²ΠΎΠΊΡ€ΡƒΠ³ Ρ†Π΅Π½Ρ‚Ρ€Π°. -ve β€” это ΡƒΠ³ΠΎΠ» ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚Π° изобраТСния ΠΏΠΎ часовой стрСлкС, Π° +ve, соотвСтствСнно, ΠΏΡ€ΠΎΡ‚ΠΈΠ² часовой.

ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ Π² Π³Ρ€Π°Π΄Π°Ρ†ΠΈΠΈ сСрого ΠΈ Π² Ρ‡Ρ‘Ρ€Π½ΠΎ-Π±Π΅Π»ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΏΠΎΡ€ΠΎΠ³Ρƒ

 

 

			import cv2
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
ret, threshold_image = cv2.threshold(im, 127, 255, 0)
viewImage(gray_image, "ΠŸΡ‘ΡΠΈΠΊ Π² градациях сСрого")
viewImage(threshold_image, "Π§Ρ‘Ρ€Π½ΠΎ-Π±Π΅Π»Ρ‹ΠΉ пёсик")
		

gray_image β€” это одноканальная вСрсия изобраТСния.

Ѐункция threshold Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ всС пиксСли, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Π΅ΠΌΠ½Π΅Π΅ (мСньшС) 127 Π·Π°ΠΌΠ΅Π½Π΅Π½Ρ‹ Π½Π° 0, Π° всС, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ярчС (большС) 127, β€” Π½Π° 255.

Для ясности Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

			ret, threshold = cv2.threshold(im, 150, 200, 10)
		

Π—Π΄Π΅ΡΡŒ всё, Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΌΠ½Π΅Π΅, Ρ‡Π΅ΠΌ 150, замСняСтся Π½Π° 10, Π° всё, Ρ‡Ρ‚ΠΎ ярчС, β€” Π½Π° 200.

ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ threshold-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ описаны здСсь.

Π Π°Π·ΠΌΡ‹Ρ‚ΠΈΠ΅/сглаТиваниС

			import cv2
blurred = cv2.GaussianBlur(image, (51, 51), 0)
viewImage(blurred, "Π Π°Π·ΠΌΡ‹Ρ‚Ρ‹ΠΉ пёсик")
		

Ѐункция GaussianBlur (Ρ€Π°Π·ΠΌΡ‹Ρ‚ΠΈΠ΅ ΠΏΠΎ Гауссу) ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ 3 ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°:

  1. Π˜ΡΡ…ΠΎΠ΄Π½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅.
  2. ΠšΠΎΡ€Ρ‚Π΅ΠΆ ΠΈΠ· 2 ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π½Π΅Ρ‡Ρ‘Ρ‚Π½Ρ‹Ρ… чисСл. Π§Π΅ΠΌ большС числа, Ρ‚Π΅ΠΌ большС сила сглаТивания.
  3. sigmaX ΠΈ sigmaY. Если эти ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ€Π°Π²Π½Ρ‹ΠΌΠΈ 0, Ρ‚ΠΎ ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ рассчитано автоматичСски.

Π‘ΠΎΠ»ΡŒΡˆΠ΅ ΠΏΡ€ΠΎ Ρ€Π°Π·ΠΌΡ‹Ρ‚ΠΈΠ΅ здСсь.

РисованиС ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ²

			import cv2
output = image.copy()
cv2.rectangle(output, (2600, 800), (4100, 2400), (0, 255, 255), 10)
viewImage(output, "Обводим ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠΌ Π»ΠΈΡ†ΠΎ пёсика")
		

Π­Ρ‚Π° функция ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ 5 ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²:

  1. Π‘Π°ΠΌΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅.
  2. ΠšΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π° Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ Π»Π΅Π²ΠΎΠ³ΠΎ ΡƒΠ³Π»Π° (x1, y1).
  3. ΠšΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π° Π½ΠΈΠΆΠ½Π΅Π³ΠΎ ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ ΡƒΠ³Π»Π° (x2, y2).
  4. Π¦Π²Π΅Ρ‚ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° (GBR/RGB Π² зависимости ΠΎΡ‚ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΉ Ρ†Π²Π΅Ρ‚ΠΎΠ²ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ).
  5. Π’ΠΎΠ»Ρ‰ΠΈΠ½Π° Π»ΠΈΠ½ΠΈΠΈ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°.

РисованиС линий

			import cv2
output = image.copy()
cv2.line(output, (60, 20), (400, 200), (0, 0, 255), 5)
viewImage(output, "2 пёсика, Ρ€Π°Π·Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Π΅ Π»ΠΈΠ½ΠΈΠ΅ΠΉ")
		

Ѐункция line ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ 5 ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²:

  1. Π‘Π°ΠΌΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ рисуСтся линия.
  2. ΠšΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π° ΠΏΠ΅Ρ€Π²ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ (x1, y1).
  3. ΠšΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ (x2, y2).
  4. Π¦Π²Π΅Ρ‚ Π»ΠΈΠ½ΠΈΠΈ (GBR/RGB Π² зависимости ΠΎΡ‚ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΉ Ρ†Π²Π΅Ρ‚ΠΎΠ²ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ).
  5. Π’ΠΎΠ»Ρ‰ΠΈΠ½Π° Π»ΠΈΠ½ΠΈΠΈ.

ВСкст Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ

			import cv2
output = image.copy()
cv2.putText(output, "We <3 Dogs", (1500, 3600),cv2.FONT_HERSHEY_SIMPLEX, 15, (30, 105, 210), 40) 
viewImage(output, "Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ с тСкстом")
		

Ѐункция putText ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ 7 ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²:

  1. НСпосрСдствСнно ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅.
  2. ВСкст для изобраТСния.
  3. ΠšΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π° Π½ΠΈΠΆΠ½Π΅Π³ΠΎ Π»Π΅Π²ΠΎΠ³ΠΎ ΡƒΠ³Π»Π° Π½Π°Ρ‡Π°Π»Π° тСкста (x, y).
  4. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ ΡˆΡ€ΠΈΡ„Ρ‚.
  5. Π Π°Π·ΠΌΠ΅Ρ€ ΡˆΡ€ΠΈΡ„Ρ‚Π°.
  6. Π¦Π²Π΅Ρ‚ тСкста (GBR/RGB Π² зависимости ΠΎΡ‚ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΉ Ρ†Π²Π΅Ρ‚ΠΎΠ²ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ).
  7. Π’ΠΎΠ»Ρ‰ΠΈΠ½Π° Π»ΠΈΠ½ΠΈΠΉ Π±ΡƒΠΊΠ².

РаспознаваниС Π»ΠΈΡ†

На этот Ρ€Π°Π· Π±Π΅Π· пёсиков.

			import cv2
image_path = "./ΠΏΡƒΡ‚ΡŒ/ΠΊ/Ρ„ΠΎΡ‚ΠΎ.Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅"
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
image = cv2.imread(image_path)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(
    gray,
    scaleFactor= 1.1,
    minNeighbors= 5,
    minSize=(10, 10)
)
faces_detected = "Π›ΠΈΡ† ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΎ: " + format(len(faces))
print(faces_detected)
# РисуСм ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Ρ‹ Π²ΠΎΠΊΡ€ΡƒΠ³ Π»ΠΈΡ†
for (x, y, w, h) in faces:
    cv2.rectangle(image, (x, y), (x+w, y+h), (255, 255, 0), 2)
viewImage(image,faces_detected)
		

detectMultiScale β€” общая функция для распознавания ΠΊΠ°ΠΊ Π»ΠΈΡ†, Ρ‚Π°ΠΊ ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Π§Ρ‚ΠΎΠ±Ρ‹ функция искала ΠΈΠΌΠ΅Π½Π½ΠΎ Π»ΠΈΡ†Π°, ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘ΠΌ Π΅ΠΉ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ каскад.

Ѐункция detectMultiScale ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ 4 ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°:

  1. ΠžΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² Π³Ρ€Π°Π΄Π°Ρ†ΠΈΠΈ сСрого.
  2. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ scaleFactor. НСкоторыС Π»ΠΈΡ†Π° ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ большС Π΄Ρ€ΡƒΠ³ΠΈΡ…, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ находятся Π±Π»ΠΈΠΆΠ΅, Ρ‡Π΅ΠΌ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅. Π­Ρ‚ΠΎΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ компСнсируСт пСрспСктиву.
  3. Алгоритм распознавания ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΡΠΊΠΎΠ»ΡŒΠ·ΡΡ‰Π΅Π΅ ΠΎΠΊΠ½ΠΎ Π²ΠΎ врСмя распознавания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ minNeighbors опрСдСляСт количСство ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π²ΠΎΠΊΡ€ΡƒΠ³ Π»ΠΈΡ†Π°. Π’ΠΎ Π΅ΡΡ‚ΡŒ Ρ‡Π΅ΠΌ большС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ этого ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, Ρ‚Π΅ΠΌ большС Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ» Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠ°ΠΊ Π»ΠΈΡ†ΠΎ. Блишком малСнькоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ количСство Π»ΠΎΠΆΠ½Ρ‹Ρ… срабатываний, Π° слишком большоС сдСлаСт Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π±ΠΎΠ»Π΅Π΅ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ.
  4. minSize β€” нСпосрСдствСнно Ρ€Π°Π·ΠΌΠ΅Ρ€ этих областСй.

Contours β€” распознаваниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²

РаспознаваниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² производится с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ†Π²Π΅Ρ‚ΠΎΠ²ΠΎΠΉ сСгмСнтации изобраТСния. Для этого Π΅ΡΡ‚ΡŒ Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: cv2.findContours ΠΈ cv2.drawContours.

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎ описано ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ†Π²Π΅Ρ‚ΠΎΠ²ΠΎΠΉ сСгмСнтации. Всё, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ для Π½Π΅Ρ‘, находится Ρ‚Π°ΠΌ.

Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ изобраТСния

			import cv2
image = cv2.imread("./ΠΈΠΌΠΏΠΎΡ€Ρ‚/ΠΏΡƒΡ‚ΡŒ.Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅")
cv2.imwrite("./экспорт/ΠΏΡƒΡ‚ΡŒ.Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅", image)
		

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

OpenCV β€” отличная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° с Π»Ρ‘Π³ΠΊΠΈΠΌΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² 3D-Ρ€Π΅Π½Π΄Π΅Ρ€Π΅, ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚ΠΎΠΌ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΈ Π²ΠΈΠ΄Π΅ΠΎ, отслСТивании ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ людСй Π½Π° Π²ΠΈΠ΄Π΅ΠΎ, поискС ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹Ρ… ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΈΠ· Π½Π°Π±ΠΎΡ€Π° ΠΈ для ΠΌΠ½ΠΎΠ³ΠΎ-ΠΌΠ½ΠΎΠ³ΠΎ Ρ‡Π΅Π³ΠΎ Π΅Ρ‰Ρ‘.

Π­Ρ‚Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½Π° для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹, связанныС с ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΌ ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅ΠΌ Π² области ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ.

Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ