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
0
投稿
猜你喜欢
- 最近看到一个题目,代码如下:public static void main(String args[]) {Thread t = new T
- 上一篇说到Springboot整合Netty,自定义协议实现,本文聊一些拆包/沾包问题。拆包/沾包问题TCP是面向字节流的协议,在发送方发送
- 互斥锁(Mutex)互斥锁是一个互斥的同步对象,意味着同一时间有且仅有一个线程可以获取它。互斥锁可适用于一个共享资源每次只能被一个线程访问的
- 路由做Android/iOS原生开发的时候,要打开一个新的页面,你得知道你的目标页面对象,然后初始化一个Intent或者ViewContro
- 1.@RequestMapping的介绍通过@RequestMapping,我们可以把请求地址和方法进行绑定的,可以在类、方法上进行声明。类
- Linux下的五种I/O模型1)阻塞I/O(blocking I/O)2)非阻塞I/O (nonblocking I/O)3) I/O复用(
- 实现跨服务的远程调用(RestTemplate)业务场景:在返回订单信息数据中显示用户信息实现思路:基于RestTemplate发起的htt
- 1.一级指针#include?<stdio.h>int?main(){?int?data?=?10;?int?*p1?=?&am
- 本文实例为大家分享了java实现发送邮箱验证码的具体代码,供大家参考,具体内容如下添加依赖<!-- 邮箱验证码 https://mvn
- 今天给大家分享纯注解版spring与mybatis的整合mybatis包下:有这几个,上面图片没有展开配置Bean:MyBatisAutoC
- 本文实例讲述了C#检测远程计算机端口是否打开的方法。分享给大家供大家参考。具体分析如下:这段C#代码用于检测远程计算机的3389端口是否处理
- 本文讲述了Java实现画线、矩形、椭圆、字符串功能的实例代码。分享给大家供大家参考,具体如下:import java.awt.Frame;
- 一些Java项目中在mybatis与spring整合中有MapperScannerConfigurer的使用,该类通过反向代理自动生成基于接
- 1. 前言Guava是一个由Google开发的Java核心库,它提供了很多有用的方法和实用工具类,可以帮助开发人员提高代码质量和开发效率。在
- ActivityManager.RunningAppProcessInfo类与获取正在运行的应用程序每一个应用程序都会运行在它独立的进程里,
- Android指定SnackBar在屏幕的位置Snackbar 常以一个小的弹出框的形式,出现在手机屏幕下方或者桌面左下方,并且是在屏幕所有
- 前言一般情况下,当我们使用 SpringDataElasticsearch 去操作 ES 时,索引名
- 本文实例为大家分享了SpringBoot使用POI进行Excel下载的具体代码,供大家参考,具体内容如下使用poi处理Excel特别方便,此
- 具体内容如下所示:Intent.ACTION_AIRPLANE_MODE_CHANGED;//关闭或打开飞行模式时的广播Intent.ACT
- 一、简介Join方法主要是用来阻塞调用线程,直到某个线程终止或经过了指定时间为止。官方的解释比较乏味,通俗的说就是创建一个子线程,给它加了这