OpenCV 鼠标手动绘制掩码图像
OpenCV 鼠标手动绘制掩码图像
完整的代码:
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
using namespace cv;
cv::Mat marker_mask;
cv::Mat markers;
cv::Mat img0, img, img_gray, wshed;
cv::Point prev_pt(-1,-1);
void on_mouse( int event, int x, int y, int flags, void* param )
{
if( !img.data )
return;
if( event == CV_EVENT_LBUTTONUP || !(flags & CV_EVENT_FLAG_LBUTTON) )
prev_pt = cv::Point(-1,-1);
else if( event == CV_EVENT_LBUTTONDOWN )
prev_pt = cv::Point(x,y);
else if( event == CV_EVENT_MOUSEMOVE && (flags & CV_EVENT_FLAG_LBUTTON) )
{
cv::Point pt(x,y);
if( prev_pt.x < 0 )
prev_pt = pt;
cv::line( marker_mask, prev_pt, pt, cv::Scalar::all(255), 1, 8, 0 );
cv::line( img, prev_pt, pt, cv::Scalar::all(255), 1, 8, 0 );
prev_pt = pt;
cv::imshow( "image", img );
}
}
int main(){
img0 = cv::imread("phase_map_org.bmp", 1);
if(!img0.data)
return 0;
cv::namedWindow( "image" );
cv::namedWindow( "watershed transform" );
img = img0.clone();
img_gray = img0.clone();
wshed = img0.clone();
marker_mask = cv::Mat( img.size(), CV_8U, cv::Scalar::all(0));
cv::imshow( "image", img );
cv::imshow( "watershed transform", wshed );
cvSetMouseCallback( "image", on_mouse, 0 );
for(;;){
int c = cv::waitKey(0);
if( (char)c == 27 )
break;
if( (char)c == 'r' ) {
marker_mask.setTo(cv::Scalar::all(0));
img0.copyTo(img);
cv::imshow( "image", img );
}
if( (char)c == 's' ) {
cv::imwrite("marker_mask.bmp", marker_mask);
std::cout << "save marker_mask.bmp finals " << std::endl;
}
if( (char)c == 'p' ) {
std::cout << "processing ... " << std::endl;
std::vector<std::vector<cv::Point> > contours;
vector<Vec4i> hierarchy;
cv::findContours( marker_mask, contours,
CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE );
marker_mask.setTo(cv::Scalar::all(0));
cv::drawContours( marker_mask, contours, -1,
cv::Scalar(255), CV_FILLED );
//cv::Mat color_tab;
std::cout << contours.size() << std::endl;
cv::imshow( "image", marker_mask );
}
}
cv::waitKey(0);
return 0;
}
得到掩码图像
将闭合环线外的部分像素值全设为0,内部全设为255.
就是在for(;;)循环里面的:
if( (char)c == 'p' ) {
std::cout << "processing ... " << std::endl;
std::vector<std::vector<cv::Point> > contours;
vector<Vec4i> hierarchy;
cv::findContours( marker_mask, contours,
CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE );
marker_mask.setTo(cv::Scalar::all(0));
cv::drawContours( marker_mask, contours, -1,
cv::Scalar(255), CV_FILLED );
//cv::Mat color_tab;
std::cout << contours.size() << std::endl;
cv::imshow( "image", marker_mask );
}
运行程序:鼠标手动绘制一个闭合环线,按P生成掩码图像
知识点
清零函数
OpenCV1的函数cvZero( marker_mask );等同于OpenCV2的函数:
marker_mask.setTo(cv::Scalar::all(0));复制函数和克隆函数
OpenCV1的函数cvCopy( 原图, 副本);等同于OpenCV2的函数:
原图.copyTo(副本);或着
副本 = 原图.clone();
参考网站:
http://blog.csdn.net/wangyaninglm/article/details/41864021
http://answers.opencv.org/question/26415/cvzero-fucntion-for-c-api/
OpenCV 鼠标手动绘制掩码图像的更多相关文章
- Python 图像处理 OpenCV (16):图像直方图
前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...
- 【OpenCV入门教程之三】 图像的载入,显示和输出 一站式完全解析(转)
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/20537737 作者:毛星云(浅墨) ...
- Python 图像处理 OpenCV (15):图像轮廓
前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...
- -_-#【Canvas】导出在<canvas>元素上绘制的图像
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- (原)使用opencv的warpAffine函数对图像进行旋转
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5070576.html 参考网址: http://stackoverflow.com/questions ...
- OpenCV成长之路:图像直方图的应用
OpenCV成长之路:图像直方图的应用 2014-04-11 13:57:03 标签:opencv 图像 直方图 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否 ...
- OpenCV成长之路:图像滤波
http://ronny.blog.51cto.com/8801997/1394138 OpenCV成长之路:图像滤波 2014-04-11 14:28:44 标签:opencv 边缘检测 sobel ...
- Matlab绘图基础——利用axes(坐标系图形对象)绘制重叠图像 及 一图多轴(一幅图绘制多个坐标轴)
描述 axes在当前窗口中创建一个包含默认属性坐标系 axes('PropertyName',propertyvalue,...)创建坐标系时,同时指定它的一些属性,没有指定的使用DefaultAxe ...
- Delphi实例之绘制正弦函数图像
Delphi实例之绘制正弦函数图像 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphic ...
随机推荐
- Python 不可变对象
str是不变对象,而list是可变对象. 对于可变对象,比如list,对list进行操作,list内部的内容是会变化的,比如: >>> a = ['c', 'b', 'a'] > ...
- c的详细学习(9)结构体与共用体的学习(一)
C语言提供了另外两种构造类型:结构体与公用体,用来存储若干个类型不同但彼此组成一个集合的数据总体. (1)结构体类型与结构体变量 1.定义 其一般形式为: struct 结构体类型名{ 数据类型1 ...
- python核心编程3-13
3.13: 添加新功能. 将你上一个问题改造好的readNwriteTextFiles.py 增加一个新功能: 允许用户编辑一个已经存在的文本文件. 你可以使用任何方式,无论是一次编辑一行,还是一次编 ...
- bigdecimal类型除法问题
坑:bigdecimal类型做除法运算时,结果为整数或有限小数时候不存在问题,若结果无法整除,为无限小数时报错 错误代码: Bigdecimal b = a.divide(c).setScale(5 ...
- Android电池驱动【转】
本文转载自:http://blog.sina.com.cn/s/blog_66a6a5ec0100n6ej.html Android的电池的管理分为三个部分:Java部分,JNI部分以及kenel部分 ...
- NetBeans字体设置
01.找到自己java字体目录.我的目录是[C:\Program Files\Java\jdk1.7.0_21\jre\lib] 02.复制fontconfig.properties.src, 重命名 ...
- 算法(Algorithms)第4版 练习 1.5.15
用归纳法推导: 1.height = 0时,成立,其level 0的节点个数为C(0,0)=1. height = 1时,成立,其level 0的节点个数为C(1,0)=1,其level 1的节点个数 ...
- Sobel导数
Sobel 导数 目标 本文档尝试解答如下问题: 如何使用OpenCV函数 Sobel 对图像求导. 如何使用OpenCV函数 Scharr 更准确地计算 核的导数. 原理 Note 以下内容来自于 ...
- form 中Enctype=multipart/form-data 的作用
form 中Enctype=multipart/form-data 的作用 ENCTYPE="multipart/form-data"用于表单里有图片上传. <form na ...
- 命令行执行大sql文件
mysql -h localhost -u root -p 123456 < F:/hello world/niuzi.sql