'cv:: inRange`(OpenCV) के साथ रंग पहचान के लिए सही ऊपरी और निचले एचएसवी सीमाओं का चयन करना




hsv color-detection (4)

मेरे पास एक नारंगी ढक्कन की स्थिति के साथ कॉफी की एक छवि है जिसे मैं ढूंढना चाहता हूं। यहाँ है ।

gcolor2 उपयोगिता ढक्कन के केंद्र में एचएसवी दिखाती है (22, 59, 100)। सवाल यह है कि रंग की सीमाओं का चयन कैसे करें? मैंने न्यूनतम = (18, 40, 9 0) और अधिकतम = (27, 255, 255) की कोशिश की, लेकिन अप्रत्याशित हो गया

पाइथन कोड यहां दिया गया है:

import cv

in_image = 'kaffee.png'
out_image = 'kaffee_out.png'
out_image_thr = 'kaffee_thr.png'

ORANGE_MIN = cv.Scalar(18, 40, 90)
ORANGE_MAX = cv.Scalar(27, 255, 255)
COLOR_MIN = ORANGE_MIN
COLOR_MAX = ORANGE_MAX

def test1():
    frame = cv.LoadImage(in_image)
    frameHSV = cv.CreateImage(cv.GetSize(frame), 8, 3)
    cv.CvtColor(frame, frameHSV, cv.CV_RGB2HSV)
    frame_threshed = cv.CreateImage(cv.GetSize(frameHSV), 8, 1)
    cv.InRangeS(frameHSV, COLOR_MIN, COLOR_MAX, frame_threshed)
    cv.SaveImage(out_image_thr, frame_threshed)

if __name__ == '__main__':
    test1()

समस्या 1: विभिन्न अनुप्रयोग एचएसवी के लिए विभिन्न पैमाने का उपयोग करते हैं। उदाहरण के लिए जिंप H = 0-360, S = 0-100 and V = 0-100 । लेकिन ओपनसीवी H: 0 - 180, S: 0 - 255, V: 0 - 255 । यहां मुझे 22 में गिंप में एक ह्यू वैल्यू मिला। तो मैंने इसके लिए आधा, 11, और परिभाषित सीमा लिया। यानी (5,50,50) - (15,255,255)

समस्या 2: और, ओपनसीवी बीजीआर प्रारूप का उपयोग करता है, आरजीबी नहीं। तो अपना कोड बदलें जो आरजीबी को एचएसवी में निम्नानुसार परिवर्तित करता है:

cv.CvtColor(frame, frameHSV, cv.CV_BGR2HSV)

अब इसे चलाओ। मुझे निम्नानुसार एक आउटपुट मिला:

आशा है कि आप यही चाहते थे। कुछ झूठी detections हैं, लेकिन वे छोटे हैं, तो आप अपने ढक्कन का सबसे बड़ा समोच्च चुन सकते हैं।

संपादित करें:

जैसा कि कार्ल फिलिप ने अपनी टिप्पणी में कहा था, नए कोड को जोड़ना अच्छा होगा। लेकिन केवल एक ही पंक्ति में परिवर्तन है। इसलिए, मैं नए cv2 मॉड्यूल में लागू एक ही कोड जोड़ना चाहता हूं, इसलिए उपयोगकर्ता नए cv2 मॉड्यूल की cv2 और लचीलापन की तुलना कर सकते हैं।

import cv2
import numpy as np

img = cv2.imread('sof.jpg')

ORANGE_MIN = np.array([5, 50, 50],np.uint8)
ORANGE_MAX = np.array([15, 255, 255],np.uint8)

hsv_img = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

frame_threshed = cv2.inRange(hsv_img, ORANGE_MIN, ORANGE_MAX)
cv2.imwrite('output2.jpg', frame_threshed)

यह उपरोक्त के समान परिणाम देता है। लेकिन कोड बहुत आसान है।


ठीक है, HSV स्पेस में रंग ढूंढें एक पुराना लेकिन आम सवाल है। मैंने विशेष रंग को तेजी से देखने के लिए एक hsv-colormap बनाया। यह रहा:

एक्स-अक्ष [0,180) में Hue का प्रतिनिधित्व करता है, वाई-अक्ष 1 [0,255] में Saturation का प्रतिनिधित्व करता है, वाई-अक्ष S = 255 प्रतिनिधित्व करता है, जबकि V = 255 रखता है।

रंग खोजने के लिए, आमतौर पर केवल H और S की सीमा के लिए देखो, और श्रेणी में सेट v (20, 255)।

नारंगी रंग खोजने के लिए, हम मानचित्र के लिए देखते हैं, और सबसे अच्छी रेंज पाते हैं: H :[10, 25], S: [100, 255], and V: [20, 255] । तो मुखौटा cv2.inRange(hsv,(10, 100, 20), (25, 255, 255) )

फिर हम नारंगी रंग की तलाश करने के लिए पाए गए रेंज का उपयोग करते हैं, यह परिणाम है:

विधि सरल है लेकिन उपयोग करने के लिए आम है:

#!/usr/bin/python3
# 2018.01.21 20:46:41 CST
import cv2

img = cv2.imread("test.jpg")
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv,(10, 100, 20), (25, 255, 255) )
cv2.imshow("orange", mask);cv2.waitKey();cv2.destroyAllWindows()

समान उत्तर:

  1. किसी छवि में केवल हरे रंग की रंग वस्तुओं का पता लगाने के लिए थ्रेसहोल्ड मान को परिभाषित करने के लिए: Opencv

  2. InRangeS के साथ ओपनसीवी थ्रेसहोल्डिंग के लिए सही एचएसवी मानों का चयन करना


मैंने रीयलटाइम में एचएसवी कोड प्राप्त करने के लिए इस सरल कार्यक्रम को बनाया

import cv2
import numpy as np


cap = cv2.VideoCapture(0)

def nothing(x):
    pass
# Creating a window for later use
cv2.namedWindow('result')

# Starting with 100's to prevent error while masking
h,s,v = 100,100,100

# Creating track bar
cv2.createTrackbar('h', 'result',0,179,nothing)
cv2.createTrackbar('s', 'result',0,255,nothing)
cv2.createTrackbar('v', 'result',0,255,nothing)

while(1):

    _, frame = cap.read()

    #converting to HSV
    hsv = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)

    # get info from track bar and appy to result
    h = cv2.getTrackbarPos('h','result')
    s = cv2.getTrackbarPos('s','result')
    v = cv2.getTrackbarPos('v','result')

    # Normal masking algorithm
    lower_blue = np.array([h,s,v])
    upper_blue = np.array([180,255,255])

    mask = cv2.inRange(hsv,lower_blue, upper_blue)

    result = cv2.bitwise_and(frame,frame,mask = mask)

    cv2.imshow('result',result)

    k = cv2.waitKey(5) & 0xFF
    if k == 27:
        break

cap.release()

cv2.destroyAllWindows()

ओपनसीवी एचएसवी रेंज है: एच: 0 से 17 9 एस: 0 से 255 वी: 0 से 255

गीम्प (या अन्य फोटो मैनिपुलेशन एस) पर ह्यू रेंज 0 से 360 तक, ओपनसीवी ने एक बाइट में रंग की जानकारी डाली है, इसलिए एक बाइट में अधिकतम संख्या मान 255 है इसलिए ओपनसीवी ह्यू वैल्यू 2 से विभाजित हंप वैल्यू के बराबर हैं ।

मुझे पता चला कि एचएसवी कलर स्पेस के आधार पर ऑब्जेक्ट डिटेक्शन करने का प्रयास करते समय एक विशिष्ट रंग को फ़िल्टर करने के लिए 5 (ओपनसीवी रेंज) की एक श्रृंखला पर्याप्त थी। मैं आपको उस एप्लिकेशन को समझने के लिए एक एचएसवी रंग ताल का उपयोग करने की सलाह दूंगा जो आपके आवेदन के लिए सबसे अच्छा काम करता है।





color-detection