opencv中snake的调用方法示例

网上流传的关于opencv中snake的用法代码,要么太旧,要么就是运行有问题,在这里我对其进行修改,可以在比较新的opencv2.3版本上运行。

Snake Code
  1 // TrainingTools.cpp : 定义控制台应用程序的入口点。
  2 //
  3 
  4 #include <iostream>
  5 #include <string.h>
  6 #include <legacy/legacy.hpp>
  7 #include <cv.h>
  8 #include <highgui.h>
  9 #include <fstream>
 10  
 11  
 12 IplImage *image = 0 ; //原始图像
 13 IplImage *image2 = 0, *image3 = 0; //原始图像copy
 14  
 15 using namespace std;
 16 int Thresholdness = 100;
 17 int ialpha = 20;
 18 int ibeta=20; 
 19 int igamma=20; 
 20 int gdwStart = 0;
 21 CvPoint *point, *point2;
 22 int length;
 23 
 24 void onmouse(int event, int x, int y, int flags, void* param)
 25 {
 26     switch(event)
 27     {
 28     case CV_EVENT_MOUSEMOVE:
 29         
 30         break;
 31     case CV_EVENT_LBUTTONDOWN:
 32         point[length++] = cvPoint(x,y);
 33         printf("%d,%d;\n", x, y);
 34         break;
 35     case CV_EVENT_RBUTTONDOWN:
 36         length = 0;
 37         break;
 38     }
 39 }
 40  
 41 void onChange(int pos)
 42 {
 43 
 44     float alpha = ialpha / 100.0f;
 45     float beta = ibeta / 100.0f;
 46     float gamma = igamma / 100.0f;
 47  
 48     CvSize size;
 49     size.width=3; 
 50     size.height=3; 
 51     CvTermCriteria criteria; 
 52     criteria.type=CV_TERMCRIT_ITER; 
 53     criteria.max_iter=1000; 
 54     criteria.epsilon=0.1; 
 55     
 56     memcpy(point2, point, length * sizeof(CvPoint));
 57     
 58     cvSnakeImage(image, point2, length, &alpha, &beta, &gamma, CV_VALUE, size, criteria, 0);
 59 }
 60  
 61 int main(int argc, char* argv[])
 62 {
 63  
 64      if(image3) cvReleaseImage(&image3);
 65     if(image2) cvReleaseImage(&image2);
 66     if(image) cvReleaseImage(&image);
 67      
 68      char *pbyFN = "as004.bmp";
 69     image2 = cvLoadImage(pbyFN, 1); //显示图片
 70     image3 = cvLoadImage(pbyFN, 1);
 71     image = cvLoadImage(pbyFN, 0); 
 72     
 73     point = new CvPoint[1000]; //分配轮廓点
 74     point2 = new CvPoint[1000];
 75     
 76     cvShowImage("win0", image2);
 77     cvSetMouseCallback("win0", onmouse, 0);
 78 #if 1    
 79     while (1)
 80     {
 81          //显示轮廓曲线
 82          
 83         for(int i = 0;i < length - 1; i++)
 84         {
 85             cvLine(image2, point[i], point[i + 1], CV_RGB(0, 0, 255), 1, 8, 0); 
 86         }
 87         cvCopyImage(image2, image3);
 88         cvShowImage("win0", image3);
 89         uchar key = cvWaitKey(40);
 90         if (key == 'c') break;
 91 //        printf("-\n");
 92     }
 93 #endif    
 94     printf("point number:%d\n", length);
 95     
 96     if (length < 10)
 97     {
 98         printf("point number must be bigger than 10.\n");
 99         return 0;
100     }
101     
102     
103     
104     cvNamedWindow("win1",0); 
105     cvCreateTrackbar("Thd", "win1", &Thresholdness, 255, onChange);
106     cvCreateTrackbar("alpha", "win1", &ialpha, 100, onChange);
107     cvCreateTrackbar("beta", "win1", &ibeta, 100, onChange);
108     cvCreateTrackbar("gamma", "win1", &igamma, 100, onChange);
109     cvResizeWindow("win1",300,500);
110     
111     onChange(0);
112      
113     while (1)
114      {
115          //显示曲线
116          cvCopyImage(image2, image3);
117         for(int i = 0; i < length - 1; i++)
118         {
119             cvLine(image3, point2[i], point2[i + 1], CV_RGB(0, 255, 0), 1, 8, 0);
120         }
121         
122         cvShowImage("win1",image3);
123         uchar key = cvWaitKey(40);
124         if (key == 'q') break;
125     }
126     
127     delete []point;
128     delete []point2;
129  
130     return 0;
131 }

本代码在linux下g++编译运行成功,为了不伤读者的脑细胞,给出相应makefile,

make file
 1 .PHONY:all clean
 2 
 3 inc:=-I/usr/local/include/opencv/ -I/usr/local/include/opencv2/
 4 libpath:=-L/usr/local/lib/
 5 libs:=-lopencv_core -lopencv_highgui -lopencv_ml -lopencv_imgproc -lopencv_legacy -lm
 6 objs:=snake.o
 7 all:$(objs)
 8     g++ -o snake $^ $(libpath) $(libs)
 9     
10 $(objs):%.o:%.cpp
11     g++ -o $@ -c $< $(inc)
12     
13 clean:
14     rm snake *.o

posted on 2012-10-19 14:28  星际浪子  阅读(2207)  评论(0编辑  收藏  举报

导航