OpenCV - Como segmentar os contornos encontrados?

Olá pessoal,

Através do método abaixo eu consegui contornar todos os meus objetos de interesse em uma imagem específica. Alguém sabe me dizer o que eu faço para manipular cada objeto? Por exemplo, acessar a ‘subimagem’ só com o objeto 1 encontrado para que eu possa calcular área, etc?? Mas só um objeto por vez…
??

Obrigado.

	public static void contornarObjetos(IplImage orgImg) {
		IplImage imgThreshold = cvCreateImage(cvGetSize(orgImg), 8, 1);
		cvInRangeS(orgImg,  CV_RGB(90, 90, 90), CV_RGB( 225, 225, 225),imgThreshold);                
		CvMemStorage storage=CvMemStorage.create();
		CvSeq contours = new CvContour();
		contours = cvCreateSeq(0, Loader.sizeof(CvContour.class), Loader.sizeof(CvSeq.class), storage);

		cvFindContours( imgThreshold, storage, contours, Loader.sizeof(CvContour.class), CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);

		cvDrawContours(orgImg, contours, CV_RGB(255, 0, 0), CV_RGB(0, 0, 0),1, 1, 8, cvPoint(0, 0));
		
		cvShowImage("Teste2",imgThreshold);
		cvShowImage("Teste",orgImg);
		cvWaitKey();
	}

A lista contours já são os contornos segmentados. É só processa-la.

Aliás, pq você está usando a interface do OpenCV 1, se já existe a OpenCV 2, totalmente orientada a objetos?

Veja um exemplo que mostra o que você quer, na documentação da própria OpenCV:
http://docs.opencv.org/2.4.2/doc/tutorials/imgproc/shapedescriptors/moments/moments.html

[quote=ViniGodoy]A lista contours já são os contornos segmentados. É só processa-la.

Aliás, pq você está usando a interface do OpenCV 1, se já existe a OpenCV 2, totalmente orientada a objetos?

Veja um exemplo que mostra o que você quer, na documentação da própria OpenCV:
http://docs.opencv.org/2.4.2/doc/tutorials/imgproc/shapedescriptors/moments/moments.html[/quote]

1 - OpenCV1: Como assim OpenCV1? Em que lugar do código vc percebe isso? O que devo fazer em relação a isso?
2 - A dúvida então agora se torna como processá-la. Como que seria o for nesse countours? Tem algum exemplo de manipulação?
3 - To tentando usar isso no java, mas o meu contour é CvSeq não da certo:

		  for( int i = 0; i< contours.size(); i++ )
		     {
		       printf(" * Contour[%d] - Area (M_00) = %.2f - Area OpenCV: %.2f - Length: %.2f \n", i, mu[i].m00, contourArea(contours[i]), arcLength( contours[i], true ) );
		       Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) );
		       drawContours( drawing, contours, i, color, 2, 8, hierarchy, 0, Point() );
		       circle( drawing, mc[i], 4, color, -1, 8, 0 );
		     }

Existem 2 versões da OpenCV. A antiga, que é estruturada, e usa classes como a IplImage.
E a OpenCV 2, onde a imagem é representada por uma cv::mat. A OpenCV 2 é orientada a objetos e a manipulação de estruturas como contornos, ou algoritmos de processamento ficou extremamente mais simples. É onde os investimentos da WillowGarage se concentram atualmente.

Não saberia dizer para a OpenCV1. Quem tem experiência nela é o juliocbq.

Também não trabalho com a OpenCV em Java. Geralmente trabalho com C++ direto.

[quote=wellingtonfoz][quote=ViniGodoy]A lista contours já são os contornos segmentados. É só processa-la.

Aliás, pq você está usando a interface do OpenCV 1, se já existe a OpenCV 2, totalmente orientada a objetos?

Veja um exemplo que mostra o que você quer, na documentação da própria OpenCV:
http://docs.opencv.org/2.4.2/doc/tutorials/imgproc/shapedescriptors/moments/moments.html[/quote]

1 - OpenCV1: Como assim OpenCV1? Em que lugar do código vc percebe isso? O que devo fazer em relação a isso?
2 - A dúvida então agora se torna como processá-la. Como que seria o for nesse countours? Tem algum exemplo de manipulação?
3 - To tentando usar isso no java, mas o meu contour é CvSeq não da certo:

for( int i = 0; i< contours.size(); i++ ) { printf(" * Contour[%d] - Area (M_00) = %.2f - Area OpenCV: %.2f - Length: %.2f \n", i, mu[i].m00, contourArea(contours[i]), arcLength( contours[i], true ) ); Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) ); drawContours( drawing, contours, i, color, 2, 8, hierarchy, 0, Point() ); circle( drawing, mc[i], 4, color, -1, 8, 0 ); } [/quote]

Wellington, você já possui as coordenadas dos pontos. É só processar pixel a pixel nesse intervalo. Ou criar uma outra a partir desses pontos:

Olha esse artigo:

Region of Interest

http://nashruddin.com/OpenCV_Region_of_Interest_(ROI)

[quote=juliocbq][quote=wellingtonfoz][quote=ViniGodoy]A lista contours já são os contornos segmentados. É só processa-la.

Aliás, pq você está usando a interface do OpenCV 1, se já existe a OpenCV 2, totalmente orientada a objetos?

Veja um exemplo que mostra o que você quer, na documentação da própria OpenCV:
http://docs.opencv.org/2.4.2/doc/tutorials/imgproc/shapedescriptors/moments/moments.html[/quote]

1 - OpenCV1: Como assim OpenCV1? Em que lugar do código vc percebe isso? O que devo fazer em relação a isso?
2 - A dúvida então agora se torna como processá-la. Como que seria o for nesse countours? Tem algum exemplo de manipulação?
3 - To tentando usar isso no java, mas o meu contour é CvSeq não da certo:

for( int i = 0; i< contours.size(); i++ ) { printf(" * Contour[%d] - Area (M_00) = %.2f - Area OpenCV: %.2f - Length: %.2f \n", i, mu[i].m00, contourArea(contours[i]), arcLength( contours[i], true ) ); Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) ); drawContours( drawing, contours, i, color, 2, 8, hierarchy, 0, Point() ); circle( drawing, mc[i], 4, color, -1, 8, 0 ); } [/quote]

Wellington, você já possui a coordenada dos pontos. É só processar a imagem neles. Ou criar uma outra a partir desses pontos:

Olha esse artigo:

Region of Interest

http://nashruddin.com/OpenCV_Region_of_Interest_(ROI)[/quote]

Mas me diga uma coisa… no meu caso são umas células e se eu fizer isso não é perigoso pegar pedaços de outras células no retângulo? Ou nesse retângulo ele só pega o objeto? Se tiver um outro proximo nao vai aparecer no retângulo?

[quote=wellingtonfoz][quote=juliocbq][quote=wellingtonfoz][quote=ViniGodoy]A lista contours já são os contornos segmentados. É só processa-la.

Aliás, pq você está usando a interface do OpenCV 1, se já existe a OpenCV 2, totalmente orientada a objetos?

Veja um exemplo que mostra o que você quer, na documentação da própria OpenCV:
http://docs.opencv.org/2.4.2/doc/tutorials/imgproc/shapedescriptors/moments/moments.html[/quote]

1 - OpenCV1: Como assim OpenCV1? Em que lugar do código vc percebe isso? O que devo fazer em relação a isso?
2 - A dúvida então agora se torna como processá-la. Como que seria o for nesse countours? Tem algum exemplo de manipulação?
3 - To tentando usar isso no java, mas o meu contour é CvSeq não da certo:

for( int i = 0; i< contours.size(); i++ ) { printf(" * Contour[%d] - Area (M_00) = %.2f - Area OpenCV: %.2f - Length: %.2f \n", i, mu[i].m00, contourArea(contours[i]), arcLength( contours[i], true ) ); Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) ); drawContours( drawing, contours, i, color, 2, 8, hierarchy, 0, Point() ); circle( drawing, mc[i], 4, color, -1, 8, 0 ); } [/quote]

Wellington, você já possui a coordenada dos pontos. É só processar a imagem neles. Ou criar uma outra a partir desses pontos:

Olha esse artigo:

Region of Interest

http://nashruddin.com/OpenCV_Region_of_Interest_(ROI)[/quote]

Mas me diga uma coisa… no meu caso são umas células e se eu fizer isso não é perigoso pegar pedaços de outras células no retângulo? Ou nesse retângulo ele só pega o objeto? Se tiver um outro proximo nao vai aparecer no retângulo?

[/quote]

É claro que esses retângulos podem colidir. A melhor coisa no caso é fazer uma união deles:

C = A U B.

Teoria de conjuntos da matemática computacional. Você deve possuir material sobre.