Skocz do zawartości

Open CV i C++ - problem z przejściem na skalę szarości


kasztanowy_jim

Polecane posty

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:

 

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!

Link do komentarza
Udostępnij na innych stronach

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.p...10/07/yFs9Y.jpg

 

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

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...