1. 程式人生 > >Intelligent Scissors 繪圖功能的構建

Intelligent Scissors 繪圖功能的構建

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