Via OpenCv Snake算法
生活随笔
收集整理的這篇文章主要介紹了
Via OpenCv Snake算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
/*
* 代碼功能:手動選定初始邊緣,使用cvSnakeImage算法迭代尋優
* 修改:jink2005 2009-11-18
* 論壇:http://www.aiseminar.cn/bbs
*/
#include "cv.h"
#include "highgui.h"
#include <iostream>
#include <vector>
#include <opencv2/legacy/legacy.hpp>
//#pragma comment(lib, "highgui.lib")
//#pragma comment(lib, "cv.lib")
//#pragma comment(lib, "cvaux.lib")
//#pragma comment(lib, "cxcore.lib")
std::vector<CvPoint> InitContour;
IplImage* temp; //= cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);
/*
* 使用直線連接輪廓點,繪制輪廓線的函數
*/
void showContent(IplImage * img)
{if(temp == NULL)temp = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);cvCopyImage(img, temp);for (int i = 0; i < InitContour.size(); i++){cvCircle(temp, InitContour[i], 2, cvScalarAll(155));if(i > 0)cvLine(temp, InitContour[i-1], InitContour[i], cvScalarAll(100), 1);}cvShowImage("srcImage", temp);
}
void on_mouse(int event, int x, int y, int flags, void* ptr)
{if(event == CV_EVENT_LBUTTONDOWN){InitContour.push_back(cvPoint(x,y));/*InitContour.push_back(cvPoint(130,130));for(int i=130;i<660;i=i+10){InitContour.push_back(cvPoint(i,130));}for(int i=130;i<660;i=i+20){InitContour.push_back(cvPoint(660,i));}for(int i=660;i>130;i=i-10){InitContour.push_back(cvPoint(i,660));}for(int i=660;i>130;i=i-20){InitContour.push_back(cvPoint(130,i));}InitContour.push_back(cvPoint(130,130));*/showContent((IplImage *)ptr);}
}
int main(int argc, char* argv[])
{IplImage * srcimage = NULL;if (argc == 2 && (srcimage = cvLoadImage((char *)argv[1], CV_LOAD_IMAGE_GRAYSCALE)) !=0);else //載入工作目錄下文件名為apple.jpg的圖片。
{srcimage = cvLoadImage("test1.jpg", CV_LOAD_IMAGE_GRAYSCALE); }if(srcimage == NULL){std::cout << "Can't find the image file!" << std::endl;return -1;}InitContour.clear();cvNamedWindow("srcImage");cvShowImage("srcImage", srcimage);cvSetMouseCallback("srcImage", on_mouse, srcimage);char c;while(char c = cvWaitKey(0))if(c == 's' || c == 'S')break;// 設置snake算法使用的參數float alpha = 1.0;float beta = 0.5;float gamma = 1.0;CvSize size;size.width = 3;size.height = 3;CvTermCriteria criteria;criteria.type = CV_TERMCRIT_ITER;criteria.max_iter = 500;criteria.epsilon = 0.1;int itetime = 100;for(int ite = 0; ite < itetime; ite++) // cvSnakeImage自己有循環,為什么這里還要?手動控制循環次數!
{CvPoint* pts = new CvPoint[InitContour.size()];for (int i = 0; i < InitContour.size(); i++){pts[i] = InitContour[i];}// 使用snake算法來修改輪廓cvSnakeImage(srcimage, pts, InitContour.size(), &alpha, &beta, &gamma, CV_VALUE, size, criteria, 1);int size = InitContour.size();// 清空原輪廓,更新為新的輪廓點
InitContour.clear();for (int i = 0; i < size; i++){InitContour.push_back(pts[i]);// 對輪廓點進行線性插值,插入中間點int next = (i + 1) % size;CvPoint ne = pts[next];if(size < 100){CvPoint mid = cvPoint((pts[i].x + ne.x) / 2, (pts[i].y + ne.y) / 2);InitContour.push_back(mid);}}delete []pts;showContent(srcimage);cvWaitKey(); // 手動控制增加迭代次數,按任意鍵
}showContent(srcimage);cvWaitKey();return 0;} Snake
鼠標左鍵畫好輪廓后,S鍵控制輪廓收縮
轉載于:https://www.cnblogs.com/gaohai/p/5788850.html
總結
以上是生活随笔為你收集整理的Via OpenCv Snake算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 这篇文章让你搞懂 SpringMVC 国
- 下一篇: 大学计算机基础知识说课,计算机基础说课课