日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Via OpenCv Snake算法

發布時間:2023/12/14 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。