⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 snake.cpp

📁 一个关于snake算法的VISUAL C++的实现
💻 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 + -