OPENCV HSV 顏色 辨識(辨別)/偵測 [EX: 烤箱燈號] (OpenCV HSV light detection)
OPENCV HSV 顏色 辨識(辨別)/偵測 [EX: 烤箱燈號] (OpenCV HSV light detection)
資料來源: https://mp.weixin.qq.com/s?__biz=MzIxOTczOTM4NA==&mid=2247490077&idx=2&sn=7139b6910336468c1ad3521b1ab44ce7&chksm=97d7ff8aa0a0769cab4a629e8c2ce27dafd343e4cc44ca29a846c343351f637aa0fec3dbb27a&scene=126&sessionid=1582005782&key=3da213d245c0d5c4753f03290399a8816fcc4ebde3b097a47bc96bc3cf3fe7550b6e972a5e0c8a9a4aa5a0fef879abb7cce54711b033069ed9fe7513c4c192cd61577309ff90e8c2574f1004a3acb5aa&ascene=1&uin=MjIwODk2NDgxNw%3D%3D&devicetype=Windows+10&version=62080079&lang=zh_TW&exportkey=AoySsgwdeicZuL3fq8nl7uc%3D&pass_ticket=roT%2BBX2IFGRvda5t4c9GQghCiTOl%2FL5GHZItVfWmLpams9po44SDab3je2xSzeQB
https://github.com/kazuar/opencv_light_detection
GITHUB:https://github.com/jash-git/OpenCV-HSV-light-detection
import os
import argparse
import numpy as np
import cv2
def create_hue_mask(image, lower_color, upper_color):
lower = np.array(lower_color, np.uint8)
upper = np.array(upper_color, np.uint8)
# Create a mask from the colors
mask = cv2.inRange(image, lower, upper)
output_image = cv2.bitwise_and(image, image, mask = mask)
return output_image
def main():
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument("-i", "--image_path", dest = 'image_path', required = True)
parser.add_argument("-o", "--output_dir", dest = 'output_dir', required = False)
args = parser.parse_args()
# Load image
image = cv2.imread(args.image_path)
# Blur image to make it easier to detect objects
blur_image = cv2.medianBlur(image, 3)
if args.output_dir:
result_image_path = os.path.join(args.output_dir, "blur_image.jpg")
cv2.imwrite(result_image_path, blur_image)
# Convert to HSV in order to
hsv_image = cv2.cvtColor(blur_image, cv2.COLOR_BGR2HSV)
if args.output_dir:
result_image_path = os.path.join(args.output_dir, "hsv_image.jpg")
cv2.imwrite(result_image_path, hsv_image)
# Get lower red hue
lower_red_hue = create_hue_mask(hsv_image, [0, 100, 100], [10, 255, 255])
if args.output_dir:
result_image_path = os.path.join(args.output_dir, "lower_red_hue.jpg")
cv2.imwrite(result_image_path, lower_red_hue)
# Get higher red hue
higher_red_hue = create_hue_mask(hsv_image, [160, 100, 100], [179, 255, 255])
if args.output_dir:
result_image_path = os.path.join(args.output_dir, "higher_red_hue.jpg")
cv2.imwrite(result_image_path, higher_red_hue)
# Merge the images
full_image = cv2.addWeighted(lower_red_hue, 1.0, higher_red_hue, 1.0, 0.0)
if args.output_dir:
result_image_path = os.path.join(args.output_dir, "full_image.jpg")
cv2.imwrite(result_image_path, full_image)
# Blur the final image to reduce noise from image
full_image = cv2.GaussianBlur(full_image, (9, 9), 2, 2)
if args.output_dir:
result_image_path = os.path.join(args.output_dir, "full_image_blur.jpg")
cv2.imwrite(result_image_path, full_image)
# Convert image to gray in order to find circles in the image
image_gray = cv2.cvtColor(full_image, cv2.COLOR_BGR2GRAY)
if args.output_dir:
result_image_path = os.path.join(args.output_dir, "full_image_gray.jpg")
cv2.imwrite(result_image_path, image_gray)
# Find circles in the image
circles = cv2.HoughCircles(image_gray, cv2.HOUGH_GRADIENT, 1.2, 100)
# If we didn't find circles, the oven status is "OFF"
if circles is None:
print "Oven is OFF"
return
# If we did find circles, the oven is "ON"
print "Oven is ON"
if args.output_dir:
# Draw the circles on the original image
circles = np.round(circles[0, :]).astype("int")
for (center_x, center_y, radius) in circles:
cv2.circle(image, (center_x, center_y), radius, (0, 255, 0), 4)
result_image_path = os.path.join(args.output_dir, "original_image_with_circles.jpg")
cv2.imwrite(result_image_path, image)
if __name__ == '__main__':
main()