Open Cv i C++

0

Od długiego czasu męczę się z zainstalowaniem open CV i połączeniem z jakimś środowiskiem programistycznym. Tak, wiem, w internecie jest kilka manuali do tego, niestety niewiele mi one dały i mam z tym wielki problem - czy to pod windowsem 7, czy pod ubuntu. Ostatecznie zainstalowałem Open CV 2.1 i Visuala C++ 2010 Express pod windą, mniej więcej wg tego poradnika:
poradnik

Wrzuciłem program wczytujący zdjęcie w jpg, wyświetlający je, wypisujący szerokość i wysokość, do wartości RGB poszczególnych pixeli też mogę się dostać. Natomiast jeśli chcę przejść na skalę szarości funkcją cvtColor lub przefiltrować obraz funkcją GaussianBlur - wynikowy obraz jest jednolicie szary, niezależnie od wczytanego zdjęcia wejściowego.

Nie wiem już, czy cały czas źle stosuję funkcje open CV (przypominam - wersja 2.1!), czy dostaję szary obraz bo nadal coś mam źle polinkowane i Visual jakoś nie wie jak te funkcje wykonywać.

Oto kod:

#include <iostream>
#include <math.h>

#include <cv.h>
#include <highgui.h>

using namespace std;
using namespace cv;

int main()
{
	
	/* wczytanie zdjecia  */
	Mat image;	
	image = imread("test.jpg",1);  

	/* wyswietlenia liczby kolumn i wierszy */
	cout<<"Liczba kolumn (szerokosc) : ";
	cout<<image.cols<<endl;
	cout<<"Liczba wierszy (wysokosc) : ";
	cout<<image.rows<<endl<<endl;
	
	/* odczytanie i wyswietlenie kolorow danego pixela */
/*	cv::Vec3b pixelColor = image.at<cv::Vec3b>(20, 600);
	int p1 = pixelColor[0];
	int p2 = pixelColor[1];
	int p3 = pixelColor[2];
	cout<<p1<<" ; "<<p2<<" ; "<<p3<<endl; */

	/* zmiana rozmiary zdjecia */
/*  Mat resized(100,100, image.type());
    resize(image, resized, resized.size()); */
	
	/* wyswietlenie zdjecia */
/*	imshow("Nazwa okna", image);
    waitKey();  */

	/* PRZEJSCIE NA SKALE SZAROSCI */
/*	Mat grayImage;
	cvtColor(image, grayImage, CV_BGR2GRAY);
	Mat resized(500,500, image.type());
        resize(grayImage, resized, resized.size());
	imshow("Nazwa okna", resized); */

        /* ZASTOSOWANIE BLURA */
/*	GaussianBlur( image, image, Size(9, 9), 2, 2 );
	Mat resized(500,500, image.type());
        resize(image, resized, resized.size());
	imshow("Nazwa okna", image); */

	system("pause");
	return 0;
}

Jak mówiłem, w tym programie zasadniczo nie działają fragmenty kodu zatytułowane "PRZEJSCIE NA SKALE SZAROSCI" i " /* ZASTOSOWANIE BLURA */" - jaki obrazek jpg bym nie wczytal, czy bede zmienial jego rozamir czy nie, czy uzyje CV_BGR2GRAY czy CV_RGB2GRAY - zawsze dostaje jednolicie szary obraz.

Już mnie złość bierze od siedzenia nad tym, będę zobowiązany jeśli ktoś z poprawnie zainstalowanym open cv 2.1 wrzuci mój kod i sprawdzi, czy zonk leży w złym zaprogramowaniu, czy jednak mam źle polinkowany open cv i Visual.

Za wszelką, możliwie rychłą pomoc - stukrotne dzięki!

0

Jako że pozostaję w podobnym temacie, i nie chcę tworzyć gigantycznego postu, dla przejrzystości tematu pozwolę sobie dodać post pod postem.

Okazało się, że problemem jest polecenie system("pause"), wystarczy je zmienić na waitKey().

Natomiast mam gorącą prośbę o pomoc do kogoś, kto ogrania trochę przetwarzanie obrazów albo/i Open CV. Chcę wykryć za pomocą funkcji HoughCircles (chyba że istnieje jakaś inna, o której nie wiem) białą kulkę zarejestrowaną na zdjęciu jpg dodanym w załączniku. Używam OpenCV 2.1 i Visuala 2010 Express, pod Win7 x64. Niestety, mimo sporego kombinowania nie umiem ustawić parametrów tej funkcji tak, żeby wykryć tą białą kuleczkę. Nie wiem, czy podaję nieodpowiednie parametry, czy ta kuleczka jest zbyt mała/zbyt rozmazana.

Niżej umieszczam kod. Zamieniam obraz kolorowy na odcienie szarości. Dalej zastanawiam się nad użyciem funkcji GaussianBlur, żeby rozmyć obrazek i pozbyć się szumów - niestety, nie udało mi się dobrać parametru filtru tak, żeby jakoś zredukować szumy - obraz po filtracji był bez zmian. Tutaj nie wiem - czy przed szukaniem okręgów użyć Blura czy nie, a jeśli tak, na jakich ustawieniach. I dalej najważniejsze - potrzebuję pomocy przy dobraniu argumentów funkcji HoughCircles tak, żeby wykrywała biała kuleczkę.

#include <iostream>
#include <math.h>

#include <cv.h>
#include <highgui.h>

using namespace std;
using namespace cv;

int main()
{
    /* wczytanie zdjecia */
    Mat image;    
    image = imread("mala_kulka.jpg",1); 

    /* wyswietlenia liczby kolumn i wierszy */
    cout<<"Liczba kolumn (szerokosc) : ";
    cout<<image.cols<<endl;
    cout<<"Liczba wierszy (wysokosc) : ";
    cout<<image.rows<<endl<<endl;
    
    /* odczytanie i wyswietlenie kolorow danego pixela (niewazne) */
/*    cv::Vec3b pixelColor = image.at<cv::Vec3b>(20, 600);
    int p1 = pixelColor[0];
    int p2 = pixelColor[1];
    int p3 = pixelColor[2];
    cout<<p1<<" ; "<<p2<<" ; "<<p3<<endl; */

    /* zmiana rozmiary zdjecia */ /*
 /*   Mat resized(100,100, image.type());
    resize(image, resized, resized.size()); */
    
 
        /* PRZEJSCIE NA SKALE SZAROSCI */
    Mat grayImage;
    cvtColor(image, grayImage, CV_RGB2GRAY);

        /* DETEKCJA KULECZKI */
    vector<Vec3f> circles;
    HoughCircles(grayImage, circles, CV_HOUGH_GRADIENT,
                 2, 50,    500,300,  5,100 );
        
    cout<<"znalezionych okregow: "<<circles.size()<<endl;

    for( size_t i = 0; i < circles.size(); i++ )
    {
         Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
         int radius = cvRound(circles[i][2]);
         // draw the circle center
         circle( image, center, 3, Scalar(252,3,0), -1, 8, 0 );
         // draw the circle outline
         circle( image, center, radius, Scalar(252,3,0), 3, 8, 0 );        
    }

    Mat resized(800,800, image.type());
        resize(image, resized, resized.size());
    imshow("Nazwa okna", resized);


    waitKey(); 
    return 0;
} 

A oto zdjęcie, na którym pracuję:
http://photoupload.pl/images/2012/10/07/yFs9Y.jpg

Ponownie będę cholernie zobowiązany za pomoc z tematem.

0

Z tego co pamiętam (niech ktoś mnie poprawi, jeśli się mylę), nie wykryje Ci nic "mądrego" na zwykłym obrazie. Pierwsze, co musisz zrobić, to znaleźć krawędzie na obrazie - najszybciej filtrem Canny'ego (cvCanny czy jakoś tak). Dopiero na tym możesz szukać jakichś prymitywów.

0

http://www.aishack.in/2010/07/tracking-colored-objects-in-opencv/

napisane przy użyciu starej wersji opencv, ale dzięki dokumentacji nie powinieneś mieć problemu z przełożeniem tego na nowszą wersję...
wszystko jest tam wytłumaczone bardzo dokładnie - naklepanie kodu, dzięki któremu będziesz w stanie śledzić kulkę nie powinno Ci zająć dłużej niż kilkadziesiąt minut :p

1 użytkowników online, w tym zalogowanych: 0, gości: 1