不规则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 ...
随机推荐
- 利用git向github中推送文件
/*游戏或者运动才能让我短暂的忘记心痛,现如今感觉学习比游戏和运动还重要——曾少锋*/ 如果对git不够熟悉的学者,可以参考:http://www.cnblogs.com/zengsf/p/75062 ...
- Loj 2008 小凸想跑步
Loj 2008 小凸想跑步 \(S(P,p_0,p_1)<S(P,p_i,p_{i+1})\) 这个约束条件对于 \(P_x,P_y\) 是线性的,即将面积用向量叉积表示,暴力拆开,可得到 \ ...
- python 获取中文文件名的输出
#coding:utf8 if __name__ == '__main__': srcfile = u"D:/测试路径/测试文件.txt" f = open(srcfile.enc ...
- day35 python学习GIL解释器锁
二 GIL介绍 GIL本质就是一把互斥锁,既然是互斥锁,所有互斥锁的本质都一样,都是将并发运行变成串行,以此来控制同一时间内共享数据只能被一个任务所修改,进而保证数据安全. 可以肯定的一点是:保护不同 ...
- 使用gitblit搭建一个简单的局域网服务器
使用gitblit搭建一个简单的局域网服务器 1.使用背景 现在很多使用github管理代码,但是github需要互联网的支持,而且私有的git库需要收费.有一些项目的代码不能外泄,所以,搭建一个局域 ...
- SQL语言:DDL/DML/DQL/DCL
SQL (Structure Query Language)语言是数据库的核心语言. SQL 的发展是从1974年开始的,其发展过程如下: 1974年-----由Boyce和Chamberlin提出, ...
- virtualbox centos安装增强工具和问题详解
virtualbox centos安装增强工具和问题详解 VirtualBox 大家都习惯性把它简称为 Vbox ,比 VM 的体积小.开源.速 度快.不过在使用 VirtualBox 在虚拟机中安装 ...
- bzoj1853幸运数字
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1853 容斥原理的应用. 发现十位的话只有2047个只含6或8的数,故可以存.它们的倍数个数只要 ...
- Microsoft Dynamics CRM4.0 JScript 过滤lookup 出现 Microsoft Dynamics CRM 窗口无法打开,可能已被弹出窗口阻止程序所阻止。
一.现象:JScript过滤lookup字段,选择lookup字段出现下图的情况: 出现:Microsoft Dynamics CRM 窗口无法打开,可能已被弹出窗口阻止程序所阻止.请将这台Micro ...
- SQL Server-- 存储过程中错误处理
一.存储过程中使用事务的简单语法 在存储过程中使用事务时非常重要的,使用数据可以保持数据的关联完整性,在Sql server存储过程中使用事务也很简单,用一个例子来说明它的语法格式: Create P ...