www.pudn.com > snake_vc++.rar > snake.cpp
//#include "stdafx.h" // STL includes: #includeusing 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; }