[英]Extracting the ROI from image with contour
我有一堆這樣的圖片:
並想提取這部分:
所以首先我使用掩蓋紅色部分,其次我使用閾值和輪廓。 但仍然不能 select 唯一的唇部。
import cv2
import matplotlib.pyplot as plt
import numpy as np
img = cv2.imread("C:/Users/TBD/Desktop/TEZ GORSEL/098.JPG")
img_hsv=cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
lower_red = np.array([0,95,50])
upper_red = np.array([2,255,255])
mask0 = cv2.inRange(img_hsv, lower_red, upper_red)
lower_red = np.array([175,95,50])
upper_red = np.array([180,255,255])
mask1 = cv2.inRange(img_hsv, lower_red, upper_red)
mask = mask0+mask1
output_img = img.copy()
output_img[np.where(mask==0)] = 0
output_hsv = img_hsv.copy()
output_hsv[np.where(mask==0)] = 0
son = cv2.cvtColor(output_hsv, cv2.COLOR_HSV2BGR)
gray_son = cv2.cvtColor(son, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray_son, 10, 255, cv2.THRESH_BINARY)
contours,hierarchy = cv2.findContours(thresh, 1, 2)
for cnt in contours:
x,y,w,h = cv2.boundingRect(cnt)
if w>1960 and h>800:
break
cropped = son[y:y+h, x:x+w]
cv2.imwrite('cropped.jpg', cropped)
在這些代碼之后我可以達到這個
但我仍然不能只提取嘴唇。 接下來我該怎么辦?
使用經典圖像處理作為您的解決方案,如果環境條件發生變化,這將改變結果。 使用面部地標,您可以獲得詳細信息並將其從圖像中裁剪為矩形。
其他解決方案可以是首先,您可以使用下面的檢測嘴,然后您可以應用您的解決方法或唇檢測。
import cv2
import numpy as np
mouth_cascade = cv2.CascadeClassifier('./cascade_files/haarcascade_mcs_mouth.xml')
if mouth_cascade.empty():
raise IOError('Unable to load the mouth cascade classifier xml file')
cap = cv2.VideoCapture(0)
ds_factor = 0.5
while True:
ret, frame = cap.read()
frame = cv2.resize(frame, None, fx=ds_factor, fy=ds_factor, interpolation=cv2.INTER_AREA)
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
mouth_rects = mouth_cascade.detectMultiScale(gray, 1.7, 11)
for (x,y,w,h) in mouth_rects:
y = int(y - 0.15*h)
cv2.rectangle(frame, (x,y), (x+w,y+h), (0,255,0), 3)
break
cv2.imshow('Mouth Detector', frame)
c = cv2.waitKey(1)
if c == 27:
break
cap.release()
cv2.destroyAllWindows()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.