1. #include <iostream> // for standard I/O
  2. #include <string> // for strings
  3. #include <iomanip> // for controlling float print precision
  4. #include <sstream> // string to number conversion
  5.  
  6. #include <opencv2/imgproc/imgproc.hpp> // Gaussian Blur
  7. #include <opencv2/core/core.hpp> // Basic OpenCV structures (cv::Mat, Scalar)
  8. #include <opencv2/highgui/highgui.hpp> // OpenCV window I/O
  9.  
  10. using namespace std;
  11. using namespace cv;
  12.  
  13. // images
  14. Mat inputImg, showImg, segMask, segShowImg;
  15.  
  16. // mask
  17. Mat fgScribbleMask, bgScribbleMask;
  18.  
  19. // user clicked mouse buttons flags
  20. bool rButtonDown = false;
  21. bool lButtonDown = false;
  22. int scribbleRadius = 5;
  23.  
  24. // mouse listener
  25. static void onMouse( int event, int x, int y, int, void* )
  26. {
  27. //cout << "On Mouse: (" << x << "," << y << ")" <<endl;
  28.  
  29. if (event == CV_EVENT_LBUTTONDOWN)
  30. {
  31. lButtonDown = true;
  32.  
  33. }
  34. else if (event == CV_EVENT_RBUTTONDOWN)
  35. {
  36. rButtonDown = true;
  37.  
  38. }
  39. else if (event == CV_EVENT_LBUTTONUP)
  40. {
  41. lButtonDown = false;
  42. }
  43. else if (event == CV_EVENT_RBUTTONUP)
  44. {
  45. rButtonDown = false;
  46. }
  47. else if (event == CV_EVENT_MOUSEMOVE)
  48. {
  49. if (rButtonDown)
  50. {
  51. // scribble the background
  52.  
  53. circle(bgScribbleMask,Point(x,y),scribbleRadius, 255,-1);
  54. circle(showImg,Point(x,y),scribbleRadius, CV_RGB(0,0,255),-1);
  55.  
  56. }
  57. else if (lButtonDown)
  58. {
  59. // scribble the foreground
  60.  
  61. circle(fgScribbleMask,Point(x,y),scribbleRadius, 255,-1);
  62. circle(showImg,Point(x,y),scribbleRadius, CV_RGB(255,0,0),-1);
  63.  
  64. //fgScribbleMask.at<char>(y,x)=(char)255;
  65. // set variables using mask
  66. //showImg.setTo(redColorElement,fgScribbleMask);
  67.  
  68. //showImg.at<Vec3b>(y,x)[0] = 0;
  69. //showImg.at<Vec3b>(y,x)[1] = 0;
  70. //showImg.at<Vec3b>(y,x)[2] = 255;
  71. }
  72.  
  73. }
  74.  
  75. imshow("Scribble Image", showImg);
  76. imshow("fg mask", fgScribbleMask);
  77. imshow("bg mask", bgScribbleMask);
  78. }
  79.  
  80. // clear everything before closing
  81. void destroyAll()
  82. {
  83. // destroy all windows
  84. destroyWindow("Input Image");
  85. destroyWindow("Scribble Image");
  86.  
  87. destroyWindow("bg mask");
  88. destroyWindow("fg mask");
  89. destroyWindow("Segmentation Mask");
  90. destroyWindow("Segmentation Image");
  91.  
  92. // clear all data
  93. fgScribbleMask.release();
  94. bgScribbleMask.release();
  95. inputImg.release();
  96. showImg.release();
  97.  
  98. segMask.release();
  99. segShowImg.release();
  100.  
  101. }
  102.  
  103. // init all images/vars
  104. int init(char * imgFileName)
  105. {
  106. // Read the file
  107. inputImg = imread(imgFileName, CV_LOAD_IMAGE_COLOR);
  108. showImg = inputImg.clone();
  109. segShowImg = inputImg.clone();
  110.  
  111. // Check for invalid input
  112. if(!inputImg.data )
  113. {
  114. cout << "Could not open or find the image: " << imgFileName << std::endl ;
  115. return -1;
  116. }
  117.  
  118. // this is the mask to keep the user scribbles
  119. fgScribbleMask.create(2,inputImg.size,CV_8UC1);
  120. fgScribbleMask = 0;
  121. bgScribbleMask.create(2,inputImg.size,CV_8UC1);
  122. bgScribbleMask = 0;
  123. segMask.create(2,inputImg.size,CV_8UC1);
  124. segMask = 0;
  125.  
  126. // Create a window for display.
  127. namedWindow( "Input Image", CV_WINDOW_AUTOSIZE );
  128. namedWindow( "Scribble Image", CV_WINDOW_AUTOSIZE);
  129.  
  130. namedWindow( "fg mask", CV_WINDOW_AUTOSIZE );
  131. namedWindow( "bg mask", CV_WINDOW_AUTOSIZE );
  132.  
  133. // Show our image inside it.
  134. imshow( "Input Image", inputImg );
  135. imshow( "Scribble Image", showImg );
  136.  
  137. imshow("fg mask", fgScribbleMask);
  138. imshow("bg mask", bgScribbleMask);
  139.  
  140. moveWindow("Scribble Image", 1,1);
  141. moveWindow("Input Image", inputImg.cols + 50,1);
  142. moveWindow("Bin Per Pixel", 2*(inputImg.cols + 50),1);
  143. moveWindow("Edges", 2*(inputImg.cols + 55),1);
  144.  
  145. // set the callback on mouse
  146. setMouseCallback("Scribble Image", onMouse, 0);
  147.  
  148. return 0;
  149. }
  150.  
  151. int main(int argc, char *argv[])
  152. {
  153.  
  154. String image_name,numBinsStr,bhaSlopeStr;
  155. cout<<"input Parameters:"<<endl;
  156. cout<<"image name: ";
  157. cin>>image_name;
  158.  
  159. // get img name parameter
  160. char * imgFileName = (char *)image_name.c_str();
  161.  
  162. if (init(imgFileName)==-1)
  163. {
  164. cout << "Could not initialize" << endl ;
  165. return -1;
  166. }
  167.  
  168. // Wait for a keystroke in the window
  169. for (;;)
  170. {
  171. char key = waitKey(0);
  172. switch (key)
  173. {
  174. case 'q':
  175. cout << "goodbye" << endl;
  176. destroyAll();
  177. return 0;
  178. case '-':
  179. //缩小画笔直径
  180. if (scribbleRadius > 2)
  181. scribbleRadius --;
  182. cout << "current radius is " << scribbleRadius << endl;
  183. break;
  184. case '+':
  185. if (scribbleRadius < 100)
  186. scribbleRadius ++;
  187. cout << "current radius is " << scribbleRadius << endl;
  188. break;
  189. case 's':
  190. {
  191.  
  192. // this is where we store the results
  193. segMask = 0;
  194. inputImg.copyTo(segShowImg);
  195. //inputImg.copyTo(showImg);
  196.  
  197. imwrite("bg.bmp",bgScribbleMask);
  198.  
  199. break;
  200.  
  201. }
  202. case 'r':
  203. {
  204. cout << "resetting" << endl;
  205. destroyAll();
  206. if (init(imgFileName)==-1)
  207. {
  208. cout << "could not initialize" << std::endl ;
  209. return -1;
  210. }
  211. break;
  212. }
  213. }
  214. }
  215.  
  216. return 0;
  217. }

OpenCV实现图像物体轮廓,前景背景,标记,并保存。的更多相关文章

  1. OpenCV图像的轮廓的匹配

    http://blog.sina.com.cn/s/blog_67a7426a0101cxl0.html 一个跟轮廓相关的最常用到的功能是匹配两个轮廓.如果有两个轮廓,如何比较它们;或者如何比较一个轮 ...

  2. OpenCV:二值图像连通区域分析与标记算法实现

    http://blog.csdn.net/cooelf/article/details/26581539?utm_source=tuicool&utm_medium=referral Open ...

  3. python-opencv在有噪音的情况下提取图像的轮廓

    对于一般的图像提取轮廓,这篇博文介绍了一个很好的方法,但是对于有噪声的图像,并不能很好地捕获到目标物体. 比如对于我的鼠标,提取的轮廓效果并不好,因为噪声很多: 所以本文增加了去掉噪声的部分. 首先加 ...

  4. 机器学习进阶-图像金字塔与轮廓检测-轮廓检测 1.cv2.cvtColor(图像颜色转换) 2.cv2.findContours(找出图像的轮廓) 3.cv2.drawContours(画出图像轮廓) 4.cv2.contourArea(轮廓面积) 5.cv2.arcLength(轮廓周长) 6.cv2.aprroxPloyDP(获得轮廓近似) 7.cv2.boudingrect(外接圆)..

    1. cv2.cvtcolor(img, cv2.COLOR_BGR2GRAY) # 将彩色图转换为灰度图 参数说明: img表示输入的图片, cv2.COLOR_BGR2GRAY表示颜色的变换形式 ...

  5. OpenCV学习代码记录——轮廓(contour)检测

    很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录. 代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tr ...

  6. opencv图像处理之在手机上实现背景虚化

    http://m.blog.csdn.net/blogercn/article/details/75004162 1.高端数码相机都具有背景虚化功能.背景虚化就是使景深变浅,使焦点聚集在主题上.一般的 ...

  7. OpenCV函数:提取轮廓相关函数使用方法

    opencv中提供findContours()函数来寻找图像中物体的轮廓,并结合drawContours()函数将找到的轮廓绘制出.首先看一下findContours(),opencv中提供了两种定义 ...

  8. 手把手教你使用LabVIEW OpenCV dnn实现物体识别(Object Detection)含源码

    前言 今天和大家一起分享如何使用LabVIEW调用pb模型实现物体识别,本博客中使用的智能工具包可到主页置顶博客LabVIEW AI视觉工具包(非NI Vision)下载与安装教程中下载 一.物体识别 ...

  9. Java基于opencv—矫正图像

    更多的时候,我们得到的图像不可能是正的,多少都会有一定的倾斜,就比如下面的 我们要做的就是把它们变成下面这样的 我们采用的是寻找轮廓的思路,来矫正图片:只要有明显的轮廓都可以采用这种思路 具体思路: ...

随机推荐

  1. [ExtJS5学习笔记]第二十七节 CMD打包错误 Error C2009: YUI Parse Error (identifier is a reserved word => debugger;)

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/41242993 本文作者:sushengmiyan ------------------ ...

  2. Spark技术内幕: Shuffle详解(一)

    通过上面一系列文章,我们知道在集群启动时,在Standalone模式下,Worker会向Master注册,使得Master可以感知进而管理整个集群:Master通过借助ZK,可以简单的实现HA:而应用 ...

  3. android 获取SD卡的图片及其路径

    1.首先是intent的设置: private static final int IMAGECODE = 0; Intent imageIntent = new Intent(Intent.ACYIO ...

  4. BCD码与16进制互转算法

    关于这类算法,以前的文章已经讲过类似的:BCD码转二进制 #include <stdio.h> // HEX转BCD //bcd_data(<0x255,>0) unsigne ...

  5. ios7内购、Game Center 实现 in-App Purchases & Game Center

    猴子原创,欢迎转载.转载请注明: 转载自Cocos2D开发网–Cocos2Dev.com,谢谢! 原文地址: http://www.cocos2dev.com/?p=514 昨天使用ios7SDK b ...

  6. I/O操作之文件压缩与解压

    与文件压缩与解压相关的类在java.util.zip包下 实例 //文件压缩 import java.io.File; import java.io.FileInputStream; import j ...

  7. UNIX网络编程——UDP 的connect函数(改进版)

    上一篇我们提到,除非套接字已连接,否则异步错误是不会返回到UDP套接字的.我们确实可以给UDP套接字调用connect,然而这样做的结果却与TCP连接大相径庭:没有三次握手.内核只是检查是否存在立即可 ...

  8. Fetch XML and ConditionExpression operators

    https://msdynamicscrmblog.wordpress.com/2013/05/10/fetch-xml-and-conditionexpression-operators-using ...

  9. Android的ViewAnimator及其子类ViewSwitcher-android学习之旅(三十三)

    ViewAnimator继承了FrameLayout,多个组件重合在一起,可以加入多个组件,然后切换的时候会有动画. ViewAnimator及其子类的继承关系 ViewAnimator常用属性 Vi ...

  10. Unity UGUI基础之Image

    UGUI的Image等价于NGUI的Sprite组件,用于显示图片. 一.Image组件: Source Image(图像源):纹理格式为Sprite(2D and UI)的图片资源(导入图片后选择T ...