首页 > 其他分享 >opencv提取不规则图像中心

opencv提取不规则图像中心

时间:2024-02-19 11:47:37浏览次数:30  
标签:std 提取 opencv 不规则 contours 图像 path include size

效果如下:

根据轮廓面积筛除了大轮廓和很小的轮廓,大家可以用其它方法实现自己想要的效果

#include <iostream>
#include <opencv2/opencv.hpp>
#include <vector>
#include <string>
using namespace cv;
using namespace std;
int main() {
  // 图像路径
  std::string path = "/test_image/test.png";

  // 提取文件名
  // 1.查找最后一个斜杠的位置
  size_t lastSlash = path.find_last_of('/');
  // 2.查找文件名开始的位置
  size_t start = lastSlash != std::string::npos ? lastSlash + 1 : 0;
  // 3.查找文件名结束的位置
  size_t end = path.find_last_of('.');
  // 4.完成文件名提取
  std::string filename = path.substr(start, end - start);

  Mat image = imread(path, IMREAD_GRAYSCALE);
  if (image.empty()) {
    cout << "无法读取图像文件" << endl;
    return -1;
  }

  // 二值化图像
  Mat binary;
  Mat colorImage;
  Mat colorImageBinary;
  threshold(image, binary, 240, 255, THRESH_BINARY);
  imshow("binary_image", binary);

  // 查找轮廓
  vector<vector<Point>> contours;
  findContours(binary, contours, RETR_LIST, CHAIN_APPROX_SIMPLE);
  vector<Point> centerPoints;
  // 提取轮廓的中心点
  for (size_t i = 0; i < contours.size(); i++) {
    double area_i = cv::contourArea(contours[i], false);
    if (area_i > 500 || area_i < 20) {
      continue;
    }
    // double area1 = cv::contourArea(contours[i]);
    // cout << "第" << i << "轮廓面积=" << area1 << endl;
    // 计算轮廓的矩
    Moments moments = cv::moments(contours[i]);

    // 计算轮廓的中心点
    Point center(moments.m10 / moments.m00, moments.m01 / moments.m00);
    centerPoints.push_back(center);
  }
  // 创建彩色图像,否则Scalar()函数只能描述灰度信息
  cvtColor(image, colorImage, COLOR_GRAY2BGR);
  cvtColor(binary, colorImageBinary, COLOR_GRAY2BGR);
  for (size_t i = 0; i < centerPoints.size(); i++) {
    // 在图像上绘制中心点
    circle(colorImage, centerPoints[i], 1, Scalar(0, 0, 255), -1);
    circle(colorImageBinary, centerPoints[i], 1, Scalar(0, 0, 255), -1);
  }
  // 显示结果
  std::string image_name1 = filename + "_result1.png";
  std::string image_name2 = filename + "_result2.png";
  imshow("Contours1", colorImage);
  imshow("Contours2", colorImageBinary);
  imwrite(image_name1, colorImage);
  imwrite(image_name2, colorImageBinary);
  waitKey(0);

  return 0;
}

 

标签:std,提取,opencv,不规则,contours,图像,path,include,size
From: https://www.cnblogs.com/kimbiao/p/18020737

相关文章

  • 基于稀疏表示的小波变换多光谱图像融合算法matlab仿真
    1.算法运行效果图预览小波变换融合   PCA融合   基于稀疏表示的小波变换多光谱图像融合算法   性能指标对比   2.算法运行软件版本matlab2022a 3.算法理论概述       随着遥感技术的飞速发展,多光谱图像融合在地球观测、环境监测、......
  • 10 个图像悬停效果 CSS & JavaScript 代码片段
    悬停效果一直是向网站添加交互元素的最简单方法之一,我们看到它们经常用于突出显示文本链接或按钮。悬停效果尤其强大的一个领域是当它们应用于图像时,无论是作为小型卡片布局的一部分还是大型相册的一部分,都可以产生很棒的效果。今天,我们将向您展示设计师将悬停效果集成到图像中的......
  • Go语言指南练习:图像
    题目:还记得之前编写的图片生成器吗?我们再来编写另外一个,不过这次它将会返回一个image.Image的实现而非一个数据切片。定义你自己的Image类型,实现必要的方法并调用pic.ShowImage。Bounds应当返回一个image.Rectangle,例如image.Rect(0,0,w,h)。ColorModel应当返回color.RGBAM......
  • 基于双树复小波变换和稀疏表示的多光谱和彩色图像融合算法matlab仿真
    1.算法运行效果图预览  2.算法运行软件版本MATLAB2022a 3.算法理论概述     基于双树复小波变换(Dual-TreeComplexWaveletTransform,DT-CWT)和稀疏表示的多光谱和彩色图像融合算法是一种先进的图像融合技术,旨在将多光谱图像(MultispectralImages,MSI)和彩......
  • 基于FPGA的图像RGB转CIE-Lab实现,包含testbench和MATLAB辅助验证程序
    1.算法运行效果图预览 将FPGA的结果导入到matlab,并和matlab的仿真结果进行对比:   2.算法运行软件版本vivado2019.2 matlab2022a 3.算法理论概述     RGB和CIE-Lab是两种常用的颜色空间,它们在不同的应用领域中各有优势。RGB颜色空间主要用于显示设备,而C......
  • 基于chaos混沌的彩色图像加解密系统matlab仿真
    1.算法运行效果图预览 2.算法运行软件版本matlab2022a 3.算法理论概述      基于混沌(Chaos)的彩色图像加解密系统是一种新型的图像加密技术,它利用了混沌理论的特性来提供高度安全的图像加密。下面将详细介绍这种系统的原理、数学公式和实现过程。 3.1混沌理论......
  • 基于NIQE算法的图像无参考质量评价算法matlab仿真
    1.算法运行效果图预览   2.算法运行软件版本MATLAB2022a  3.算法理论概述      NIQE(NaturalnessImageQualityEvaluator)算法是一种无参考图像质量评价算法,旨在评估图像的自然度,即图像看起来是否像自然场景。NIQE基于一组“质量感知”特征,并将其拟合到MV......
  • C++OpenCV 按之前图片名称保存图片
    C++OpenCV按之前图片名称保存图片://图片地址cv::Stringpattern="./path/*.jpeg";//可以使用cv::glob函数来获取匹配模式的文件路径列表std::vector<cv::String>file_paths;cv::glob(pattern,file_paths);for(size_ti=0;i<file_paths.size();i++){//......
  • VS2022+OpenCV_contrib安装
    准备:Cmake,OpenCV安装包,OpenCV扩展包安装步骤:一:OpenCV扩展包编译打开文件夹新建一个文件夹 打开cmake开始编译第一栏Whereisthesourcecode是指OpenCV解压后得到的source文件的路径;第二栏wheretobuildthebinaries是指编译后输出文件的路径,直接在opencv的同个大文件......
  • c++ OpenCV 读取某个文件夹下的所有图片
    方案一:将文件夹中图像遍历到vector中#include<vector>#include<opencv2/imgproc.hpp>#include<opencv2/highgui.hpp>std::vector<cv::Mat>ReadImage(cv::Stringpattern){std::vector<cv::String>fn;cv::glob(pattern,fn,false);......