2011-12-21 19 views
12

किसी प्रकार की "अवकाश परियोजना" के रूप में मैं ओपनसीवी के साथ खेल रहा हूं और सामानों का पता लगाने और मापना चाहता हूं।ओपनसीवी सी ++/ओबीजे-सी: उचित ऑब्जेक्ट डिटेक्शन

वर्तमान कार्यप्रवाह (प्रारंभिक चरण - का पता लगाने): स्केल (सीवी :: cvtColor)

  1. Convert
  2. अनुकूली सीमा लागू करें (सीवी :: adaptiveThreshold)
  3. लागू चालाक बढ़त का पता लगाने (सीवी: : कैनी)
  4. ढूँढना आकृति (सीवी :: findContours)

मेरे परिणाम थोड़े भद्दा है और मुझे यकीन है कि क्या righ है नहीं कर रहा हूँ टी दिशा जाने के लिए। मुझे पहले से ही मेरे वर्तमान सेटअप (ओएसएक्स 10.7.2, एक्सकोड 4.2.1) के तहत काम कर रहे सीवीब्लोब मिल गया है? क्या यह जाने का एक बेहतर तरीका है? यदि हां, तो मैं इसे सही तरीके से कैसे कार्यान्वित कर सकता हूं?

या मुझे पहले पृष्ठभूमि घटाव की आवश्यकता है? मुझे लगता है कि कोशिश की, लेकिन आकृति को खोजने के लिए बाद में

यहाँ मेरी छवि है में सक्षम नहीं था: output

अद्यतन: image to measure

और वह मेरी उत्पादन, जब मैं पहली छवि में वापस मेरी आकृति आकर्षित

मैं अपने programm में काम मिल गया और मेरे उत्पादन कुछ अलग दिखाई देता ...

- (IBAction)processImage:(id)sender 
{ 
    cv::Mat forground = [[_inputView image] CVMat]; 
    cv::Mat result = [self isolateBackground:forground]; 
    [_outputView setImage:[NSImage imageWithCVMat:result]]; 
} 

- (cv::Mat)isolateBackground:(cv::Mat &)_image 
{ 
    int rh = 255, rl = 100, gh = 255, gl = 0, bh = 70, bl = 0; 
    cv::cvtColor(_image, _image, CV_RGB2HSV_FULL); 
    cv::Mat element = getStructuringElement(cv::MORPH_RECT, cv::Size(5, 5)); 
    cv::Mat bgIsolation; 
    cv::inRange(_image, cv::Scalar(bl, gl, rl), cv::Scalar(bh, gh, rh), bgIsolation); 
    bitwise_not(bgIsolation, bgIsolation); 
    erode(bgIsolation, bgIsolation, cv::Mat()); 
    dilate(bgIsolation, bgIsolation, element); 
    return bgIsolation; 
} 

उत्तर

10

यह एक हैक की तरह हो सकता है, लेकिन जब से यह एक "छुट्टी परियोजना" है, मैं यह वैसे भी पोस्ट करेंगे :)

आप पृष्ठभूमि को अलग करने की कोशिश की और फिर मुखौटा inverting (यह कुछ भी नहीं ग्रहण करेंगे है पृष्ठभूमि एक वस्तु है, लेकिन यह आपके इच्छित काम के लिए काम कर सकती है)।

नीचे परिणाम मैं OpenCV inRange फ़ंक्शन का उपयोग मिल गया है: enter image description here

आप GuassianBlur के साथ छवि (पूर्व प्रक्रिया) सम करने के लिए jagginess में से कुछ से छुटकारा पाने के लिए चाहते हो सकता। मैंने कुछ शोर पिक्सल से छुटकारा पाने के लिए क्षरण कर्नेल (5x5 बनाम 3x3) की तुलना में एक बड़ा फैलाव कर्नेल का उपयोग किया। चिकनाई से थ्रेसहोल्ड को ट्विक करने में भी मदद मिल सकती है जिससे क्षरण अनावश्यक हो सकता है। लेकिन, आपको शुरू करना चाहिए।

#include <opencv2/core/core.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/imgproc/imgproc.hpp> 
#include <vector> 

using namespace cv; 
using namespace std; 

int main(int argc, char** argv) 
{ 
    Mat src = imread("test.jpg"); 


    int rh = 255, rl = 100, gh = 255, gl = 0, bh = 70, bl = 0; 

    string windowName = "background"; 
    namedWindow(windowName); 

    createTrackbar("rh", windowName, &rh, 255); 
    createTrackbar("rl", windowName, &rl, 255); 
    createTrackbar("gh", windowName, &gh, 255); 
    createTrackbar("gl", windowName, &gl, 255); 
    createTrackbar("bh", windowName, &bh, 255); 
    createTrackbar("bl", windowName, &bl, 255); 

    // for dilation 
    Mat element = getStructuringElement(MORPH_RECT, Size(5, 5)); 

    Mat bgIsolation; 
    int key = 0; 
    do 
    { 
     inRange(src, Scalar(bl, gl, rl), Scalar(bh, gh, rh), bgIsolation); 

     bitwise_not(bgIsolation, bgIsolation); 

     erode(bgIsolation, bgIsolation, Mat()); 
     dilate(bgIsolation, bgIsolation, element); 

     imshow(windowName, bgIsolation); 
     key = waitKey(33); 
    } while((char)key != 27); 

    waitKey(); 

    return 0; 
} 

छुट्टी परियोजना का आनंद लें:

अंत में, यहाँ मेरी त्वरित छोटे कोड का टुकड़ा मैं इस श्रृंखला मिल के लिए इस्तेमाल किया है! मजेदार लग रहा है :)

+0

बहुत बहुत धन्यवाद! क्या आप मेरे कोड को देख सकते हैं? – dom

+0

@moosgummi आपको एक अलग आउटपुट प्राप्त करने का कारण यह है कि आप एचएसवी कलर स्पेस में बदल रहे हैं। मेरी दहलीज आरजीबी अंतरिक्ष के लिए थी। आप एचएसवी का उपयोग कर सकते हैं, लेकिन आपको उस स्थान के लिए उपयुक्त श्रेणियां ढूंढनी होंगी। आप मेरे नमूना अनुप्रयोग में उस रंग रूपांतरण को जोड़ सकते हैं, और इसे आज़माएं। मुझे कल्पना है कि आपको केवल ह्यू और संतृप्ति चैनलों के बारे में चिंता करने की आवश्यकता होगी क्योंकि वैल्यू चैनल में कोई रंगीन जानकारी नहीं है (यानी, वैल्यू रेंज को छूटा नहीं जाएगा [0, 255])। उम्मीद है की वो मदद करदे! – mevatron

+0

आह ठीक है, तो इसे आरजीबी में बेहतर काम करना चाहिए?ब्लू, ग्लो और आरएल नीले, हरे और लाल मान हैं। क्या मैं सही हू? – dom

संबंधित मुद्दे