Opencv图像处理之轮廓外背景颜色改变

 更新时间:2019年05月21日 15:00:36   作者:hihushine  
这篇文章主要为大家详细介绍了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);

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Visual Studio2022报错无法打开源文件 "openssl/conf.h"解决方法

    Visual Studio2022报错无法打开源文件 "openssl/conf.h"解决方法

    这篇文章主要介绍了Visual Studio2022报错无法打开源文件"openssl/conf.h"解决方式,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • C++超详细讲解模拟实现vector

    C++超详细讲解模拟实现vector

    这篇文章主要介绍了C++ 容器 Vector 的使用方法,Vector 是一个能够存放任意类型的动态数组,有点类似数组,是一个连续地址空间,下文更多详细内容的介绍,需要的小伙伴可以参考一下
    2022-07-07
  • Qt实现定时器的两种方法分享

    Qt实现定时器的两种方法分享

    这篇文章主要为大家详细介绍了Qt中实现定时器的两种不同方法,文中的示例代码讲解详细,对我们了解Qt有一定的帮助,感兴趣的可以跟随小编一起学习一下
    2022-11-11
  • C语言模拟内存函数分析之mencpy与memmove

    C语言模拟内存函数分析之mencpy与memmove

    这篇文章主要介绍了C语言详解如何模拟内存函数,用到了mencpy与memmove两个函数,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03
  • 探讨:程序在内存中的分配(常量,局部变量,全局变量,程序代码)问题

    探讨:程序在内存中的分配(常量,局部变量,全局变量,程序代码)问题

    本篇文章是对程序在的内存中分配(常量,局部变量,全局变量,程序代码)的问题进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • Qt中JSON操作的具体使用

    Qt中JSON操作的具体使用

    本文主要介绍了Qt中JSON操作的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • 关于VS2022不能使用<bits/stdc++.h>的解决方案(万能头文件)

    关于VS2022不能使用<bits/stdc++.h>的解决方案(万能头文件)

    #include<bits/stdc++.h>包含了目前 C++ 所包含的所有头文件,又称万能头文件,那么如何在VS2022中使用万能头呢?下面小编给大家代理了关于VS2022不能使用<bits/stdc++.h>的解决方案(万能头文件),感兴趣的朋友一起看看吧
    2022-03-03
  • C语言实现超市管理系统

    C语言实现超市管理系统

    这篇文章主要为大家详细介绍了C语言实现超市管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • C语言实现弹跳小球

    C语言实现弹跳小球

    这篇文章主要为大家详细介绍了C语言实现弹跳小球,设置了小球分数及过关难度,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • C语言银行系统课程设计

    C语言银行系统课程设计

    这篇文章主要为大家详细介绍了C语言银行系统课程设计,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01

最新评论