www.pudn.com > snake_vc++.rar > snake.cpp


//#include "stdafx.h" 
 
// STL includes: 
#include  
using namespace std; 
 
// OpenCV includes 
#include "highgui.h" 
 
// local includes 
#include "snake.h" 
#include "QtCvWrapper.h" 
 
 
//////////////////////////////////////////////////////////////////////////// 
Snake::Snake(QtCvWrapper* parent, IplImage* inImg) : 
	m_parent(parent), 
	m_inImg(0), 
	m_snakeImg(0), 
	m_alpha((float)1.0), 
	m_beta((float)1.0), 
	m_gamma((float)1.2), 
	m_numSegments(200), 
	m_numIteration(20) 
{ 
	m_inImg = cvCloneImage(inImg); 
 
	m_winSize.width = 5; 
	m_winSize.height = 5; 
 
	m_snakeImg = cvCreateImage( cvSize(m_inImg->width, m_inImg->height),  
		IPL_DEPTH_8U, 3); 
	m_crit = cvTermCriteria(CV_TERMCRIT_ITER, m_numIteration, 0.0); 
	m_snakeCurve = new CvPoint[m_numSegments]; 
} 
 
//////////////////////////////////////////////////////////////////////////// 
Snake::~Snake(void) 
{ 
	delete[] m_snakeCurve; 
} 
 
//////////////////////////////////////////////////////////////////////////// 
void Snake::initSnakeCurve() 
{ 
	m_snakeCurve = new CvPoint[m_numSegments]; 
	for(int i = 0; i < m_numSegments; i++) 
	{ 
		m_snakeCurve[i].x = cvRound( 0.8 * m_inImg->width * cos(i * 6.28 / m_numSegments) / 2.0 
			+ m_inImg->width / 2 ); 
 
		m_snakeCurve[i].y = cvRound( 0.8 * m_inImg->height * sin(i * 6.28 / m_numSegments) / 2.0 
			+ m_inImg->height / 2 ); 
	} 
} 
 
//////////////////////////////////////////////////////////////////////////// 
void Snake::initSnakeCurve(CvPoint* pt) 
{ 
	m_snakeCurve = pt; 
	if(m_inImg->nChannels == 1) 
		cvCvtColor(m_inImg, m_snakeImg, CV_GRAY2RGB); 
	else if (m_inImg->nChannels == 3) 
		cvCopy( m_inImg, m_snakeImg, NULL); 
 
	for (int actSegment = 0; actSegment < m_numSegments; actSegment++) 
	{ 
		if(actSegment < m_numSegments-1) 
			cvLine(m_snakeImg, pt[actSegment], pt[actSegment+1], 
			CV_RGB(255, 0, 0), 2, 1); 
		else 
			cvLine(m_snakeImg, pt[actSegment], pt[0], 
			CV_RGB(0, 255, 0), 2, 1); 
	} 
} 
 
//////////////////////////////////////////////////////////////////////////// 
IplImage* Snake::iterateSnakeCurve(int numIterations, bool showIterations) 
{ 
	m_snakeImg = cvCreateImage( cvSize(m_inImg->width, m_inImg->height),  
		IPL_DEPTH_8U, 3); 
 
	char wndName[] = "SNAKE"; 
 
	for (int i = 0; i < numIterations; i++) 
	{ 
		cvSnakeImage(m_inImg, m_snakeCurve, m_numSegments,  
			&m_alpha, &m_beta, &m_gamma, 1, m_winSize, m_crit, 1); 
 
		if (showIterations) 
		{ 
			// clear the line with loading the inital image 
			if(m_inImg->nChannels == 1) 
				cvCvtColor(m_inImg, m_snakeImg, CV_GRAY2RGB); 
			else if (m_inImg->nChannels == 3) 
				cvCopy( m_inImg, m_snakeImg, NULL); 
			else 
				qDebug("SNAKE - iterate: Undefined number of channels in the input image!"); 
 
			for (int actSegment = 0; actSegment < m_numSegments; actSegment++) 
			{ 
				if(actSegment < m_numSegments-1) 
					cvLine(m_snakeImg, m_snakeCurve[actSegment], m_snakeCurve[actSegment+1], 
					CV_RGB(255, 0, 0), 2, 1); 
				else 
					cvLine(m_snakeImg, m_snakeCurve[actSegment], m_snakeCurve[0], 
					CV_RGB(0, 255, 0), 2, 1); 
			} 
			if (m_parent->iterate() == true) 
			{ 
				cvNamedWindow( wndName, 1 ); 
				cvResizeWindow( wndName, m_inImg->width,m_inImg->height ); 
				cvShowImage( wndName, m_snakeImg ); 
 
				if (m_parent->step() == true) 
					cvWaitKey(0); 
				else 
					cvWaitKey(200); 
			} 
		} 
	} 
	cvDestroyWindow(wndName); 
	return m_snakeImg; 
}