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. ubuntu 16.04 jenkins pipline的实现 最终docker启动服务

    准备工作:两台虚拟机A:192.168.1.60 B:192.168.1.61 C:一个存放代码的代码库(github)A:jenkins git docker openssh-server(ssh) ...

  2. ubuntu14.04 spring cloud config server + gradle搭建

    Server端:在eclipse上,创建Java Project项目.自带的src包删掉手动建文件夹.基础的目录文件都创建上 |--ZSpringCloud|--build.gradle|----sr ...

  3. 手机端适配rem代码片段

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. C++的动态库和静态库(dll)

    一,在VS里面 新建项目->Visual C++ -> win32 控制台应用程序 -> 填写项目名称->下一步选择 dll : 二,自动生成的文件如图: 以项目名称生成的My ...

  5. 织梦dedecms 调用文章图片数功能

    function BodyImgNum($aid) { global $dsql; $sql = "select aid,body from dede_addonarticle where ...

  6. UESTC 1061 秋实大哥与战争 线段树区间合并

    秋实大哥与战争 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) 男儿何不带吴钩, ...

  7. appium-环境搭建(三)

    appium步骤:基本环境1.由于操作手机端操作,需要模拟器或者真机 itools模拟器,真机2.appium操作app,需要知道操作的app是什么?需要知道这个app包名 1.问开发 2.利用adt ...

  8. C语言小程序(五)、数组查询

    随机产生一些字符,然后输入要查找的字符,本想将查找到的字符存储起来,要么初始化一个等大小的数组,要么要先检索出总共查找到多少个元素,再开辟空间存储,但这样相当于搜索了两遍,没有想到更好的方法,只是简单 ...

  9. google android sdk下载hoosts

    203.208.46.146 www.google.com #这行是为了方便打开Android开发官网 现在好像不VPN也可以打开 74.125.113.121 developer.android.c ...

  10. 洛谷【P1619】 解一元二次方程的烦恼

    我对模拟的理解:https://www.cnblogs.com/AKMer/p/9064018.html 题目传送门:https://www.luogu.org/problemnew/show/P16 ...