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