不规则ROI的提取
在网上看到基于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的提取的更多相关文章
- C++ 中利用 Opencv 得到不规则的ROI 区域(已知不规则区域)
因为需要,之前写了一个利用mask 得到不规则ROI 区域的程序. 现在需要修改,发现自己都看不懂是怎么做的了.. 所以把它整理下来. 首先利用 鼠标可以得到 你想要的不规则区域的 顶点信息.具体这里 ...
- opencv——感兴趣区域(ROI)的分析和选取[详细总结]
引言 在利用OpenCV对图像进行处理时,通常会遇到一个情况,就是只需要对部分感兴趣区域进行处理.因此,如何选取感兴趣区域呢?(其实就是"抠图"). 在学习opencv的掩码运算后 ...
- 【OpenCV函数】轮廓提取;轮廓绘制;轮廓面积;外接矩形
FindContours 在二值图像中寻找轮廓 int cvFindContours( CvArr* image, CvMemStorage* storage, CvSeq** first_cont ...
- OpenCV-Python:车道检测
任务: 一共要完成两项任务: 1. 在所提供的公路图片上检测出车道线并标记 2. 在所提供的公路视频上检测出车道线并标记 方案: 要检测出当前车道,就是要检测出左右两条车道直线.由于无人车一直保持在当 ...
- opencv6.5-imgproc图像处理模块之轮廓
接opencv6.4-imgproc图像处理模块之直方图与模板 这部分的<opencv_tutorial>上都是直接上代码,没有原理部分的解释的. 十一.轮廓 1.图像中找轮廓 /// 转 ...
- java OPENCV 连通域, Imgproc.findContours 例子,参数说明
http://stackoverflow.com/questions/29491669/real-time-paper-sheet-detection-using-opencv-in-android/ ...
- 论文笔记:Mask R-CNN
之前在一次组会上,师弟诉苦说他用 UNet 处理一个病灶分割的任务,但效果极差,我看了他的数据后发现,那些病灶区域比起整张图而言非常的小,而 UNet 采用的损失函数通常是逐像素的分类损失,如此一来, ...
- 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 ...
- 论文阅读笔记三十六:Mask R-CNN(CVPR2017)
论文源址:https://arxiv.org/pdf/1703.06870.pdf 开源代码:https://github.com/matterport/Mask_RCNN 摘要 Mask R-CNN ...
随机推荐
- opencv-python教程学习系列5-处理鼠标事件
前言 opencv-python教程学习系列记录学习python-opencv过程的点滴,本文主要介绍opencv-python处理鼠标事件,坚持学习,共同进步. 系列教程参照OpenCV-Pytho ...
- No.01——配置编程环境
======由于很喜欢Android编程,所以买来了安卓权威指南来学习.为了应用费曼技巧——把知识输出出去以检验和巩固,在此写下学习笔记======= 1. 配置编程环境 Java的JDK(Java ...
- Android中对文件的读写进行操作
1. 在文件的地方生成一个read.txt文件,并且写入一个read数据.IO流用完之后一定要记得关闭. 对于try和catch是对于错误的抓取. 2. 首先先new file来找到那个文件,然后在通 ...
- JS常用功能
1.字符串转Json var json='[{"id":0,"text":"ddddd"},{"id":1," ...
- Hadoop操作前准备工作
摘要:本文介绍Hadoop操作前的准备工作. 关键词:Hadoop Linux JDK WinSCP 俗语说,“磨刀不误砍柴工”.Hadoop操作前的准备工作可以加快Hadoop的操作与应用. ...
- 两个有用Oracle运算:intersect和minus运算
intersect运算 返回查询结果中相同的部分 exp:各个部门中有哪些相同的工种 select job from account intersect select job from researc ...
- 使用C#和MSMQ开发消息处理程序
简介 MSMQ(微软消息队列)是Windows操作系统中消息应用程序的基础,是用于创建分布式.松散连接的消息通讯应用程序的开发工具.消息队列和电子邮件有着很多相似处,他们都包含多个属性,用于保存消息, ...
- 管理node.js版本的模块:n
n模块的使用: 命令 作用 yarn global add n 全局安装n n stable 升级node.js到最新稳定版 n v0.10.26 或 n 0.10.26 升级到指定版本号
- JMeter--使用URL回写来处理用户会话
如果测试的Web应用系统使用URL回写而非Cookie来保存会话信息,那么测试人员需要做一些额外的工作来测试web站点 为了正确回应URL回写,JMeter需要解析从服务器收到的HTML,并得到唯一的 ...
- [C++ Primer] : 第10章: 泛型算法
概述 泛型算法: 称它们为"算法", 是因为它们实现了一些经典算法的公共接口, 如搜索和排序; 称它们是"泛型的", 是因为它们可以用于不同类型的元素和多种容器 ...