OpenCV phát hiện màu da bất biến với những thay đổi chiếu sáng


8

Tôi phải chụp màu da độc lập với ánh sáng. Tôi đã sử dụng các tiêu chí sau (sử dụng hsv và rgb) nhưng nó không hoạt động:

int h = get_hue(...);
int s = get_saturation(...);
int r = get_red_component(...);
int g = get_green_component(...);
int b = get_blue_component(...);

if ((h<38)&&(h>6)&&(s>0.23)&&(s<0.68)){
    // skin color
}
else if ((r>95) && (g>40) && (b>20) && 
         ((maximum(r,g,b)-minimum(r,g,b))>15) && 
         (abs(r-g)>15)&&(r>g)&&(r>b)){
   // also skin color
}

Nó hoạt động vào buổi sáng khi da tôi được chiếu sáng nhưng đến tối thì nó không hoạt động.

Bất kỳ trợ giúp sẽ được đánh giá cao. Cảm ơn trước. (PS-da tôi không trắng.)


2
Bạn có thể cung cấp hình ảnh mẫu, và có thể mô tả đầu ra mong muốn tốt hơn một chút? Bạn có muốn "phân loại" pixel hình ảnh thành các lớp không dada không? Ngoài ra, bạn có thể thử và chứng minh các tiêu chí của mình không, có thể nó không tệ lắm nhưng nó sẽ giúp chúng tôi cải thiện nó nếu chúng tôi hiểu cách bạn đưa ra nó.
Penelope

2
Điều này có thể giúp ích (tức là để loại bỏ hiệu ứng chiếu sáng trước): dsp.stackexchange.com/a/459353
datageist

Hai tiêu chí này tôi vừa đạt được từ việc googling và vâng Tôi phải phân biệt da với các vùng da không
Roney Island


1
đây là một câu hỏi cũ của tôi, có lẽ nó có thể giúp: dsp.stackexchange.com/questions/1625/ mẹo
nkint

Câu trả lời:


4

Theo kinh nghiệm của tôi, phương pháp tốt nhất cho việc này là chuyển đổi nó sang không gian màu Lab. L đại diện cho ánh sáng, và a và b là ánh sáng độc lập. OpenCV hỗ trợ chuyển đổi thang màu Lab.


Tôi đã thấy nhận xét tương tự trong cẩm nang nhận dạng khuôn mặt (Springer). Lab nên là một không gian màu tốt hơn.
sansuiso

2

Đối với trường hợp đặc biệt này, tôi khuyên bạn nên đọc mô hình LAB Color.

Và liên quan đến mô hình Màu LAB, hãy đọc trên Delta E. Khoảng cách giữa 2 màu. Thông tin chi tiết về không gian màu có thể được tìm thấy ở đây: http://www.codeproject.com/Articles/613798/Colorspaces-and-Conversions

Tôi chưa bao giờ thử mô hình màu LAB qua OpenCV vì việc chuyển đổi từ RGB sang LAB trở lại là một rắc rối (đòi hỏi một bước ngay lập tức).

Nhưng tôi đã khám phá Delta E trên MatLab để thành công lớn. Trước tiên, bạn phải chọn giao diện, vẽ ROI nhỏ trên video / hình ảnh và chương trình sẽ tìm thấy tất cả các tông màu chính xác giống như giao diện bạn đã chọn qua ROI.

Một lựa chọn khác cũng là nhìn vào kết cấu. Một bản xem trước ngắn gọn tại đây: http://books.google.com.vn/books?id/bRlk_WjfITIC = 0CDUQ6AEwAQ # v = onepage & q = skin% 20threshold% 20from% 20texture & f = false

Điều này về cơ bản là đào tạo một cơ sở dữ liệu hình ảnh. Nhận xét ở đây nếu bạn cần trợ giúp để đào tạo cơ sở dữ liệu hình ảnh hoặc chuyển đổi ColorSpace. Một chút bận rộn, vì vậy câu trả lời chỉ là những gợi ý mà bạn có thể làm. Chúc mừng.


1

thử cái này:

''' Detect human skin tone and draw a boundary around it.
Useful for gesture recognition and motion tracking.

Inspired by: http://stackoverflow.com/a/14756351/1463143

Date: 08 June 2013
'''

# Required moduls
import cv2
import numpy

# Constants for finding range of skin color in YCrCb
min_YCrCb = numpy.array([0,133,77],numpy.uint8)
max_YCrCb = numpy.array([255,173,127],numpy.uint8)

# Create a window to display the camera feed
cv2.namedWindow('Camera Output')

# Get pointer to video frames from primary device
videoFrame = cv2.VideoCapture(0)

# Process the video frames
keyPressed = -1 # -1 indicates no key pressed

while(keyPressed < 0): # any key pressed has a value >= 0

    # Grab video frame, decode it and return next video frame
    readSucsess, sourceImage = videoFrame.read()

    # Convert image to YCrCb
    imageYCrCb = cv2.cvtColor(sourceImage,cv2.COLOR_BGR2YCR_CB)

    # Find region with skin tone in YCrCb image
    skinRegion = cv2.inRange(imageYCrCb,min_YCrCb,max_YCrCb)

    # Do contour detection on skin region
    contours, hierarchy = cv2.findContours(skinRegion, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    # Draw the contour on the source image
    for i, c in enumerate(contours):
        area = cv2.contourArea(c)
        if area > 1000:
            cv2.drawContours(sourceImage, contours, i, (0, 255, 0), 3)

    # Display the source image
    cv2.imshow('Camera Output',sourceImage)

    # Check for user input to close program
    keyPressed = cv2.waitKey(1) # wait 1 milisecond in each iteration of while loop

# Close window and camera after exiting the while loop
cv2.destroyWindow('Camera Output')
videoFrame.release()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.