?? snake.cpp
字號:
//#include "stdafx.h"
// STL includes:
#include <iostream>
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;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -