2011-12-09 20 views
14

जब आप किसी छवि से रूपरेखा प्राप्त करते हैं, तो आपको प्रत्येक ब्लॉब में 2 रूपरेखा मिलनी चाहिए - एक आंतरिक और एक बाहरी। नीचे दिए गए चक्र पर विचार करें - चूंकि सर्कल एक पिक्सेल चौड़ाई वाली एक रेखा है जो एक से बड़ी है, तो आपको छवि में दो रूपों को खोजने में सक्षम होना चाहिए - एक सर्कल के भीतरी भाग से और बाहरी भाग से एक।OpenCV में Contours ढूँढना?

ओपनसीवी का उपयोग करके, मैं INNER contours को पुनर्प्राप्त करना चाहता हूं। हालांकि, जब मैं findContours() का उपयोग करता हूं, तो मुझे केवल बाहरी रूप मिलते हैं। ओपनसीवी का उपयोग करके मैं ब्लॉब के आंतरिक रूपों को कैसे प्राप्त करूं?

मैं सी ++ एपीआई का उपयोग कर रहा हूं, सी नहीं, इसलिए केवल सी ++ एपीआई का उपयोग करने वाले कार्यों का सुझाव देता है। (यानी cvFindContours())

धन्यवाद।

enter image description here

+0

क्या आप हमें कुछ कोड दिखा सकते हैं? – SSteve

+0

ठीक है, मेरे पास वास्तव में कोई अद्वितीय कोड नहीं है। मेरे पास सिर्फ एक मैट है जिसे मैं कैमरे से पुनर्प्राप्त करता हूं। मैं उस पर कैनी एज डिटेक्टर चलाता हूं, और फिर findContours() का उपयोग करके समरूपता पाता हूं। पाए गए सभी समोच्च वेक्टर <वेक्टर > में संग्रहित होते हैं। मूल रूप से मेरे पास बस इतना है कि वास्तविक कोड पोस्ट करने में मुझे बहुत कुछ नहीं है - यह सिर्फ समोच्च खोजने की पारंपरिक प्रक्रिया है। – fdh

+0

मैंने समोच्चों के साथ थोड़ा सा काम किया है, हालांकि मेरी रूचि केवल बाहरी रूपों में थी। मैंने 'drawContours()' के साथ एक समोच्च रंग लगाने की कोशिश की। जो एक प्रकार की पदानुक्रम से बचता है। 'ड्रॉकंटर्स()' पर नमूना जिसका मैंने उपयोग किया था, आंतरिक रंगों को रंग नहीं था। मैं यहां क्या प्राप्त करने की कोशिश कर रहा हूं, यह है कि आपको शायद उन्हें खोजने के लिए 'findContours()' से पदानुक्रम सरणी का उपयोग करने की आवश्यकता है। (कारण मैं उत्तर नहीं पोस्ट करता हूं कि इस पदानुक्रम का मेरा ज्ञान सीमित है, मैं इस मामले पर आपको भ्रमित नहीं करना चाहता हूं। मैंने इन पर कुछ परीक्षण किया है और मैं अब तक अपनी समझ समझा सकता हूं, अगर आप अनुरोध करते हैं।) – Sonaten

उत्तर

19

मैं अपनी छवि पर इस कोड को भाग गया और यह एक आंतरिक और बाहरी समोच्च लौट आए।

#include <iostream> 
#include "opencv2/core/core.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
#include "opencv2/highgui/highgui.hpp" 

int main(int argc, const char * argv[]) { 

    cv::Mat image= cv::imread("../../so8449378.jpg"); 
    if (!image.data) { 
     std::cout << "Image file not found\n"; 
     return 1; 
    } 

    //Prepare the image for findContours 
    cv::cvtColor(image, image, CV_BGR2GRAY); 
    cv::threshold(image, image, 128, 255, CV_THRESH_BINARY); 

    //Find the contours. Use the contourOutput Mat so the original image doesn't get overwritten 
    std::vector<std::vector<cv::Point> > contours; 
    cv::Mat contourOutput = image.clone(); 
    cv::findContours(contourOutput, contours, CV_RETR_LIST, CV_CHAIN_APPROX_NONE); 

    //Draw the contours 
    cv::Mat contourImage(image.size(), CV_8UC3, cv::Scalar(0,0,0)); 
    cv::Scalar colors[3]; 
    colors[0] = cv::Scalar(255, 0, 0); 
    colors[1] = cv::Scalar(0, 255, 0); 
    colors[2] = cv::Scalar(0, 0, 255); 
    for (size_t idx = 0; idx < contours.size(); idx++) { 
     cv::drawContours(contourImage, contours, idx, colors[idx % 3]); 
    } 

    cv::imshow("Input Image", image); 
    cvMoveWindow("Input Image", 0, 0); 
    cv::imshow("Contours", contourImage); 
    cvMoveWindow("Contours", 200, 0); 
    cv::waitKey(0); 

    return 0; 
} 

यहाँ आकृति यह पाया हैं:

findContour result image

+0

धन्यवाद का उपयोग कर रहा हूं। क्या आपको पता चलेगा कि आंतरिक रूप से केवल आंतरिक रूपों को कैसे पहुंचाया जाए? छेद की सीमाओं के रूप में? – fdh

+2

यदि आप 'CV_RETR_LIST' के बजाय मोड को' CV_RETR_TREE' पर सेट करते हैं तो आपको समोच्चों का पदानुक्रमित पेड़ मिलता है ताकि आंतरिक समोच्च बाहरी समोच्च से नीचे हो। यह आंतरिक बनाम बाहरी रूपों का भेद नहीं करता है, इसलिए यदि सर्कल के अंदर एक सर्कल था, तो दोनों समोच्च बाहरी सर्कल के भीतरी समोच्च से नीचे होंगे। [ओपनसीवी खोजकंटोर ट्यूटोरियल] (http://opencv.itseez.com/doc/tutorials/imgproc/shapedescriptors/find_contours/find_contours.html#find-contours) 'CV_RETR_TREE' का उपयोग करता है। – SSteve

3

मुझे लगता है कि क्या फरहद पूछ रहा है मूल छवि से समोच्च काटने के लिए है।

ऐसा करने के लिए आपको उपरोक्त समझाए गए समोच्च को ढूंढने की आवश्यकता होगी, फिर मूल से अंदर लाने के लिए एक मुखौटा का उपयोग करें, और फिर परिणाम को उसी आकार के साथ समोच्च के रूप में क्रॉप करें।

0

Findcontours फ़ंक्शन सभी समरूपों में सभी समोच्चों को संग्रहीत करता है, कोड में सभी समोच्चों को खींचा जाता है, आपने केवल आंतरिक के अनुरूप समोच्च खींचा है, आईडीएक्स वैरिएबल है जो बताता है कि कौन सा समोच्च खींचा जाता है।