在网上看到基于opencv3.0之前的API实现不规则ROI的提取,我自己试了一下发现opencv3.0不行,第一想法是我写的有问题,最后发现是API的改版。原理很简单。

目标:提取黑线作为ROI

原理:先滤波-->>灰度化-->>二值化-->>边缘提取-->>寻找图像轮廓-->>轮廓画在一张空图像-->>水漫填充图像轮廓区域-->>两个图像与操作

灰度化:

二值化:

边缘提取:

空白图像画轮廓:

水漫之后的图像:

与操作之后图像:

为了效果明显,我画边界的时候用的是粗实线,而程序求解的是最大边,所以看起来边缘不是很理想,实际操作可以优化

程序:

 #include<iostream>
#include <opencv2/opencv.hpp>
#include <math.h>
using namespace cv;
using namespace std; int Threshold_Value = ;
const int Threshold_Max_value = ;
const int Threshold_type_value = ;
double g_Area = ; RNG rng(); Mat input_image, threshold_image, output_image, Middle_image; void Threshold_Image_Bar(int, void *); int main(int argc, char**argv)
{
input_image = imread("1.jpg");
if (input_image.data == NULL) {
return -; cout << "can't open image.../";
}
imshow("Sourse Image", input_image);
blur(input_image, Middle_image, Size(, ), Point(-, -), );
imshow("Blur Image", Middle_image);
cvtColor(Middle_image, Middle_image, COLOR_RGB2GRAY);
imshow("Gray Image", Middle_image);
namedWindow("Threshold Image", );
createTrackbar("阈值调整", "Threshold Image", &Threshold_Value, , Threshold_Image_Bar);
Threshold_Image_Bar(, );
waitKey();
return ;
} void Threshold_Image_Bar(int, void *)
{
threshold(Middle_image, threshold_image, , , );
Canny(threshold_image, threshold_image, Threshold_Value, Threshold_Value * );
imshow("Threshold Image", threshold_image); vector<vector<Point>> contours;
vector<Vec4i> hireachy;
findContours(threshold_image, contours, hireachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(-, -));
char flag_count = ;
Mat Show_threImage = Mat::zeros(threshold_image.size(), CV_8UC3);
RotatedRect MinRect;
for (size_t i = ; i < contours.size(); i++)
{
const Scalar color = Scalar(rng.uniform(, ), rng.uniform(, ), rng.uniform(, ));
drawContours(Show_threImage, contours, static_cast<int>(i), color, , , hireachy, , Point());
//----利用面积进行判断是否为最大区域------//
double area = contourArea(contours[i]);
g_Area = g_Area > area ? g_Area : area;
flag_count = (area == g_Area) ? static_cast<int>(i) : flag_count;//记录最大边界
}
imshow("Draw_Image_Contours", Show_threImage); Mat gray, Change_image = Mat::zeros(input_image.size(), input_image.type());
gray.create(input_image.size(), input_image.type());
drawContours(gray, contours, flag_count, Scalar(, , ), , , hireachy, , Point());
Rect s = boundingRect(contours[flag_count]);//为了找内部的一个种子点,自己随便定义也可以
floodFill(gray, Point(s.x + s.width / , s.y + s.height / ), Scalar(, , ));//黑色区域变成白色,遇到白色区域停止
imshow("", gray);
bitwise_and(input_image, gray, gray);
imshow("wjy", gray); }

不规则ROI的提取的更多相关文章

  1. C++ 中利用 Opencv 得到不规则的ROI 区域(已知不规则区域)

    因为需要,之前写了一个利用mask 得到不规则ROI 区域的程序. 现在需要修改,发现自己都看不懂是怎么做的了.. 所以把它整理下来. 首先利用 鼠标可以得到 你想要的不规则区域的 顶点信息.具体这里 ...

  2. opencv——感兴趣区域(ROI)的分析和选取[详细总结]

    引言 在利用OpenCV对图像进行处理时,通常会遇到一个情况,就是只需要对部分感兴趣区域进行处理.因此,如何选取感兴趣区域呢?(其实就是"抠图"). 在学习opencv的掩码运算后 ...

  3. 【OpenCV函数】轮廓提取;轮廓绘制;轮廓面积;外接矩形

    FindContours 在二值图像中寻找轮廓  int cvFindContours( CvArr* image, CvMemStorage* storage, CvSeq** first_cont ...

  4. OpenCV-Python:车道检测

    任务: 一共要完成两项任务: 1. 在所提供的公路图片上检测出车道线并标记 2. 在所提供的公路视频上检测出车道线并标记 方案: 要检测出当前车道,就是要检测出左右两条车道直线.由于无人车一直保持在当 ...

  5. opencv6.5-imgproc图像处理模块之轮廓

    接opencv6.4-imgproc图像处理模块之直方图与模板 这部分的<opencv_tutorial>上都是直接上代码,没有原理部分的解释的. 十一.轮廓 1.图像中找轮廓 /// 转 ...

  6. java OPENCV 连通域, Imgproc.findContours 例子,参数说明

    http://stackoverflow.com/questions/29491669/real-time-paper-sheet-detection-using-opencv-in-android/ ...

  7. 论文笔记:Mask R-CNN

    之前在一次组会上,师弟诉苦说他用 UNet 处理一个病灶分割的任务,但效果极差,我看了他的数据后发现,那些病灶区域比起整张图而言非常的小,而 UNet 采用的损失函数通常是逐像素的分类损失,如此一来, ...

  8. R-CNN,SPP-NET, Fast-R-CNN,Faster-R-CNN, YOLO, SSD, R-FCN系列深度学习检测方法梳理

    1. R-CNN:Rich feature hierarchies for accurate object detection and semantic segmentation 技术路线:selec ...

  9. 论文阅读笔记三十六:Mask R-CNN(CVPR2017)

    论文源址:https://arxiv.org/pdf/1703.06870.pdf 开源代码:https://github.com/matterport/Mask_RCNN 摘要 Mask R-CNN ...

随机推荐

  1. Unity3D游戏-愤怒的小鸟游戏源码和教程(二)

    Unity愤怒的小鸟游戏教程(二) 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) AngryEva游戏效果 ...

  2. 隐藏微信小程序剪贴板提示

    wx.setClipboardData 剪贴内容老是有一个Toast提示,很不爽,如何隐藏? 只要你代码写得够快,提示都追不上你. wx.setClipboardData({ data: '女朋友了? ...

  3. ASP.NET MVC Area 的使用

    MVC提供Area机制,在同一个项目之内就能够切割出不同的ASP.NET MVC网站. 插入:首先在相同的位置,比如说同一个文件夹(如:Controllers)是不能创建俩个相同名称的文件(如:Hom ...

  4. 使用php的curl根据关键词爬取百度搜索结果页

    http://bbs.csdn.net/wap/topics/390938327 正则表达式匹配Html标签   查找所有的TD区域(最短):<td\s*.*>\s*.*<\/td& ...

  5. Centos安装git2.2.1

    由于Centos6.5使用yum -y install git 安装的git版本是 git --versiongit version 1.7.1 想要升级到2.2.1: ># yum remov ...

  6. java.lang.BootstrapMethodError: java.lang.NoClassDefFoundError: scala/runtime/java8/JFunction1$mcII$sp

    报错信息: Exception in thread "main" java.lang.BootstrapMethodError: java.lang.NoClassDefFound ...

  7. oracle 导入excel

    方法二.利用PLSQL Developer使用PLSQL Developer工具,这个可是大名鼎鼎的Oracle DBA最常使用的工具.在单个文件不大的情况下(少于100000行),并且目的表结构已经 ...

  8. PHP 小技巧之如何避免参数多次传递?

    开发中经常遇到函数参数传递的问题:比如 A调用B,B调用C,C调用D, A->B->C->D 而D方法可能需要一个参数,这个参数只能在A中获取(比如A是控制器方法),这个参数这样一级 ...

  9. Windows 7 With Sp1 简体中文旗舰版

    Windows 7 With Sp1 简体中文旗舰版(MSDN官方原版) 安装Windows 7对于硬件配置的基本要求: •1 GHz 32 位或 64 位处理器 •1 GB 内存(基于32 位)或 ...

  10. JSP+JavaBean+Servlet技术(MVC模型)

    一,Servlet开发用户在浏览器中输入一个网址并回车,浏览器会向服务器发送一个HTTP请求.服务器端程序接受这个请求,并对请求进行处理,然后发送一个回应.浏览器收到回应,再把回应的内容显示出来.这种 ...