2011-12-21 22 views
12

Jako rodzaj "projektu wakacyjnego" bawię się z OpenCV i chcę wykryć i zmierzyć rzeczy.OpenCV C++/Obj-C: Właściwe wykrywanie obiektów

Aktualny workflow (wczesny etap - detekcja):

  1. Konwersja na skalę szarości (CV :: cvtColor)
  2. Zastosuj próg adaptacyjnego (cv :: adaptiveThreshold)
  3. Zastosuj canny (CV: : Canny)
  4. Znalezienie kontury (cv :: findContours)

Mój wynik jest dosyć słaba i nie jestem pewien, co jest righ t kierunek do przejścia. Mam już działającego cvBloba przy mojej obecnej konfiguracji (OSX 10.7.2, Xcode 4.2.1). Czy jest to lepszy sposób na przejście? Jeśli tak, jak mogę go wdrożyć we właściwy sposób?

Czy muszę najpierw odejmować tło? Próbowałem to, ale nie był w stanie znaleźć kontury potem

Oto moje zdjęcie: image to measure

A to moje wyjście, gdy rysuję moje kontury z powrotem do pierwszego obrazu: output

UPDATE

mam to działa w moim programm i moje wyjście wygląda nieco inaczej ...

- (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; 
} 

Odpowiedz

10

Może to być rodzaj hack, ale ponieważ jest to „projekt święto”, wyślę go w każdym razie :)

Czy próbowali izolować tła, a następnie odwrócenie maski (byłoby to nic nie zakładamy tło jest obiektem, ale może działać tak, jak chcesz).

Poniżej jest wynikiem Mam użyciu funkcji OpenCV inRange: enter image description here

Może chcesz wygładzić obraz (pre-process) z GuassianBlur pozbyć niektórych jagginess. Użyłem większego jądra dylatacji niż jądro erozji (5x5 vs. 3x3), aby pozbyć się hałaśliwych pikseli. Wygładzanie może pomóc w dostosowaniu progów, aby erozja była niepotrzebna. Ale to powinno zacząć.

Wreszcie, tutaj jest mój mały fragment kodu szybkie Kiedyś znaleźć działy

#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; 
} 

Enjoy projekt wakacje! Wygląda świetnie :)

+0

Wielkie dzięki! Czy możesz rzucić okiem na mój kod? – dom

+0

@moosgummi Powodem, dla którego otrzymujesz inne wyniki, jest przekształcenie się w przestrzeń kolorów HSV. Moje progi dotyczyły przestrzeni RGB. Możesz użyć HSV, ale musisz znaleźć odpowiednie zakresy dla tej przestrzeni. Możesz dodać tę konwersję kolorów do mojej przykładowej aplikacji i wypróbować ją. Wyobrażam sobie, że musisz martwić się tylko o kanały barw i nasycenia, ponieważ kanał wartości nie zawiera żadnych informacji o kolorach (tzn. Zakres wartości nie zostałby zmieniony [0, 255]). Mam nadzieję, że pomaga! – mevatron

+0

Ach, ok, więc powinno działać lepiej w RGB?bl, gl i rl to wartości niebieskie, zielone i czerwone. Czy mam rację? – dom

Powiązane problemy