Intelligent Scissors 繪圖功能的構建
阿新 • • 發佈:2018-11-21
GitHub倉庫地址:https://github.com/djybbb/Intelligent-Scissors
繪圖功能需求描述
首先,程式的繪製部分是需要實時互動的,即使用者點選設定了seed point後,再次移動滑鼠,在移動滑鼠的過程中影象不停地展示滑鼠位置到seed point的最小代價路徑。
動態繪圖的實現方式
在滑鼠回撥函式中,每次回撥都新建一個Mat temp,將原圖的影象資料拷貝到temp中,然後在temp上進行繪製,然後重新整理opencv的視窗。
例如我在滑鼠回撥函式的末尾加了一個draw()函式:
void on_mouse(int event, int x, int y, int flags, void * ustc) { //左鍵、右鍵、滑鼠移動事件處理 ... ... ... //每次滑鼠事件都將更新畫面 draw(); }
draw()函式:
void draw() {
Mat temp;
image.copyTo(temp);
//繪製輪廓、當前路徑等等
...
...
...
//重新顯示圖片
imshow(imageName, temp);
}
如何繪製路徑
如何得到影象中所有的畫素點到seed point的最小代價路徑可參見下一節,這裡可以先給出結論:每條最小代價路徑都是一個List(當然可以用別的資料結構,這裡只是我的實現):
list<CvPoint>current_path;
在draw()函式中,遍歷這個List,在每一個CvPoint上繪製一個圓點:
void draw() {
...
for (auto n : current_path)
circle(temp, n, 1, Scalar(0, 255, 0), -1, 8, 0);
...
}
系列部落格與總結
Intelligent Scissors 介紹 :https://blog.csdn.net/DdogYuan/article/details/80371070
Intelligent Scissors 繪圖功能的構建:https://blog.csdn.net/DdogYuan/article/details/80371116
Intelligent Scissors 原理與實現: https://blog.csdn.net/DdogYuan/article/details/80554873