Opencv图像处理之轮廓外背景颜色改变
作者:hihushine 发布时间:2022-02-17 01:33:34
标签:opencv,背景,颜色
本文实例为大家分享了Opencv轮廓外背景颜色改变的具体代码,供大家参考,具体内容如下
自行学习弄得简单代码,使用了图像中的轮廓发现以及提取,再绘制出来,改变轮廓外的像素
首先,头文件,写的比较多,没用的可以自己去除
#include <opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include"opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <fstream>
#include <opencv2/opencv.hpp>
//命名空间
using namespace cv;
using namespace std;
//图片数据名字,原图,灰度图,二值图,直方图
Mat src,src_gray,dst,src_equ;
//声明一个函数,建立滑动条
static void on_trackbar(int, void*);
主函数
int main(int argc, char** argv)
{
//图片读入
src = imread("D:\\PersonWork\\OpenCV\\program\\picture data\\0400.bmp");
//判断是否存在
if (!src.data)
{
cout << "Image no find,error!" << endl;
}
//灰度转换
cvtColor(src,src_gray, CV_BGR2GRAY);
//原图窗口,显示
namedWindow("原图", 0);
imshow("原图", src);
//二值图窗口
namedWindow("二值图", 0);
// 滑动条
int nThreshold = 120;
createTrackbar("graybar", "二值图", &nThreshold, 255,on_trackbar);
on_trackbar(nThreshold, 0);
waitKey(0);
destroyWindow("原图");
destroyWindow("二值图");
destroyWindow("result");
return 0;
}
回调函数
static void on_trackbar(int pos, void*)
{
//二值化
threshold(src_gray, dst, pos, 255, CV_THRESH_BINARY);
imshow("二值图", dst);
//直方均匀化
equalizeHist(dst, src_equ);
//识别轮廓
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
findContours(src_equ, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE);
//轮廓数量,可没有
//int len=contours.size();
//cout<<len<<endl;
//将图拷贝,进行遍历图片每个像素
Mat secImg = src_gray.clone();
const int np =secImg.rows * secImg.channels();
const int nr = secImg.rows;
for(int j=0;j<nr;j++){
uchar *sdata = secImg.ptr<uchar>(j);
for(int i=0;i<np;i++){
//判断是否在轮廓上或者外面,如果在便将像素变为255,即白色,因为这里需要的是最外轮廓,所以为contours[0],如果还需要别的,contours[i],i 可以取其他值
if (pointPolygonTest(contours[0],Point(i,j),false) != 1)
sdata[i]=255;
}
}
}
//result窗口以及显示结果
namedWindow("result",0);
imshow("result",secImg);
}
来源:https://blog.csdn.net/hihushine/article/details/78267343


猜你喜欢
- @ApiModel使用场景在实体类上边使用,标记类时swagger的解析类概述提供有关swagger模型的其它信息,类将在操作中用作类型时自
- SnackBar是DesignSupportLibrary中的一个重要的控件,用于在界面下面提示一些关键信息,跟Toast不同的地方是Sna
- 本文实例讲述了Java实现的并发任务处理方法。分享给大家供大家参考,具体如下:public void init() { super.init
- 平均背景法的基本思想是计算每个像素的平均值和标准差作为它的背景模型。平均背景法使用四个OpenCV函数:cvAcc(),累积图像;cvAbs
- Java的super关键字当子类重写父类的方法后,子类对象将无法直接访问父类被重写的方法。为了解决这个问题,在Java中专门提供了一个sup
- mybatis plus新增(insert)数据获取主键id在我们执行insert操作的时候,往往会需要拿到新插入数据的主键id做下一步操作
- poi解析Excel文件版本问题解决办法poi解析Excel文件时有两种格式: HSSFWorkbook格式用来解析Excel2003(xl
- 记录自己用java swing做的第一个简易界面。LoginAction.javapackage com.QQUI0819;import j
- 本文实例为大家分享了Android实现图片设置圆角形式的具体代码,供大家参考,具体内容如下1.自定义的图片圆角形式CircleImageVi
- maven导入依赖<dependencies> <dependency> &
- 写一个简单的mybatis plus插件自动生成代码的例子pom.xml 添加配置<!-- mybatis plus 插件-->
- 一个Maprduce程序主要包括三部分:Mapper类、Reducer类、执行类。Maven项目下所需依赖<dependencies&
- 本文实例讲述了java可变参数当做数组处理的方法.分享给大家供大家参考,具体如下:java可变参数当做数组处理ava1.5增加了新特性:可变
- 一、RESTful风格API的好处API(Application Programming Interface),顾名思义:是一组编程接口规范
- springBoot Junit测试用例出现@Autowired不生效前提条件:1,测试类上面添加支持的注解就能取到spring中的容器的实
- 在.net4.0以后异步操作,并行计算变得异常简单,但是由于公司项目开发基于.net3.5所以无法用到4.0的并行计算以及Task等异步编程
- 以下我们系统通过原理,过程等方便给大家深入的简介了Java NIO的函数机制以及用法等,学习下吧。前言本篇主要讲解Java中的IO机制分为两
- mongodb是最早热门非关系数据库的之一,使用也比较普遍,一般会用做离线数据分析来使用,放到内网的居多。由于很多公司使用了云服务,服务器默
- Java线程同步属于Java多线程与并发编程的核心点,需要重点掌握,下面我就来详解Java线程同步的4种主要的实现方式什么是Java线程同步
- 为什么要学习Android与H5互调?微信,QQ空间等大量软件都内嵌了H5,不得不说是一种趋势。Android与H5互调可以让我们的实现混合