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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值