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生成掩码图像

知识点

  1. 清零函数

    OpenCV1的函数

    cvZero( marker_mask );  

    等同于OpenCV2的函数:

    marker_mask.setTo(cv::Scalar::all(0));
  2. 复制函数和克隆函数

    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 鼠标手动绘制掩码图像的更多相关文章

  1. Python 图像处理 OpenCV (16):图像直方图

    前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...

  2. 【OpenCV入门教程之三】 图像的载入,显示和输出 一站式完全解析(转)

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/20537737 作者:毛星云(浅墨)  ...

  3. Python 图像处理 OpenCV (15):图像轮廓

    前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...

  4. -_-#【Canvas】导出在<canvas>元素上绘制的图像

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  5. (原)使用opencv的warpAffine函数对图像进行旋转

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5070576.html 参考网址: http://stackoverflow.com/questions ...

  6. OpenCV成长之路:图像直方图的应用

    OpenCV成长之路:图像直方图的应用 2014-04-11 13:57:03 标签:opencv 图像 直方图 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否 ...

  7. OpenCV成长之路:图像滤波

    http://ronny.blog.51cto.com/8801997/1394138 OpenCV成长之路:图像滤波 2014-04-11 14:28:44 标签:opencv 边缘检测 sobel ...

  8. Matlab绘图基础——利用axes(坐标系图形对象)绘制重叠图像 及 一图多轴(一幅图绘制多个坐标轴)

    描述 axes在当前窗口中创建一个包含默认属性坐标系 axes('PropertyName',propertyvalue,...)创建坐标系时,同时指定它的一些属性,没有指定的使用DefaultAxe ...

  9. Delphi实例之绘制正弦函数图像

    Delphi实例之绘制正弦函数图像 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphic ...

随机推荐

  1. c++之helloworld与命名空间

    首先在linux中需要安装g++编译器. 在中端输入 uname -a,可以查看版本信息. 输入g++,如果提示错误.则需要使用sudo apt-get install g++. #include&l ...

  2. path.join()和path.resolve()区别

    一.区别 1.path.join() 方法使用平台特定的分隔符作为定界符将所有给定的 path 片段连接在一起,然后规范化生成的路径. 2.path.resolve() 方法将路径或路径片段的序列解析 ...

  3. In a Web Application and Mobile (hybrid), how to know which this platform running?

    needed depending on the platform to change the CSS to suit the size of the font. for example the DbG ...

  4. Oracle——索引,序列,触发器

    1.索引 1)注意 oracle创建主键时会自动在该列上创建索引 2)索引原理 A.  若没有索引,搜索某个记录时(例如查找name='wish')需要搜索所有的记录,因为不能保证只有一个wish,必 ...

  5. Logstash的插件

    Logstash的插件: input插件: File:从指定的文件中读取事件流: 使用FileWatch(Ruby Gem库)监听文件的变化. .sincedb:记录了每个被监听的文件的inode, ...

  6. Codeforces 509F Progress Monitoring:区间dp【根据遍历顺序求树的方案数】

    题目链接:http://codeforces.com/problemset/problem/509/F 题意: 告诉你遍历一棵树的方法,以及遍历节点的顺序a[i],长度为n. 问你这棵树有多少种可能的 ...

  7. HTML5 canvas save()和restore()方法讲解

    我们尝试用这个连续矩形的例子来描述 canvas 的状态堆是如何工作的.第一步是用默认设置画一个大四方形,然后保存一下状态.改变填充颜色画第二个小一点的白色四方形,然后再保存一下状态.再次改变填充颜色 ...

  8. python3 字符串属性(一)

    python3 字符串属性 >>> a='hello world' >>> dir(a) ['__add__', '__class__', '__contains_ ...

  9. POJ 1504,ZOJ 2001,UVA 713, Adding Reversed Numbers,错误,已找到错误

    ------------------------------------------------------------ 以此题警告自己: 总结, 1.在数组的使用时,一定别忘了初始化 2.在两种情况 ...

  10. director.js实现前端路由

    注:director.js的官网 https://github.com/flatiron/director director.js是什么? 理解:前端的route框架,director.js客户端的路 ...