zoukankan      html  css  js  c++  java
  • 获取图片中对象轮廓并替换白色

    //
    //  ViewController.m
    //  opencvTest
    //
    //  Created by mac on 2020/7/16.
    //  Copyright © 2020 mac. All rights reserved.
    //
    #import <opencv2/opencv.hpp>
    #import <opencv2/imgcodecs/ios.h>
    #import <opencv2/imgproc.hpp>
    #import <opencv2/core/types.hpp>
    #import "ViewController.h"
    
    @interface ViewController ()
    
    @property (nonatomic, strong) UIImageView *imageView;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view.
        self.imageView = [[UIImageView alloc] initWithFrame:self.view.bounds];
        self.imageView.contentMode = UIViewContentModeScaleAspectFit;
        [self.view addSubview:self.imageView];
        self.imageView.image = [self.class opencvImageEdge:[UIImage imageNamed:@"888"]];
    }
    
    // 填充Holes
    void fillHole(const cv::Mat srcBw, cv::Mat &dstBw)
    {
        cv::Size m_Size = srcBw.size();
        cv::Mat Temp = cv::Mat::zeros(m_Size.height + 2, m_Size.width + 2, srcBw.type());//延展图像
        srcBw.copyTo(Temp(cv::Range(1, m_Size.height + 1), cv::Range(1, m_Size.width + 1)));
    
        floodFill(Temp, cv::Point(0, 0), cv::Scalar(255));
    
        cv::Mat cutImg;//裁剪延展的图像
        Temp(cv::Range(1, m_Size.height + 1), cv::Range(1, m_Size.width + 1)).copyTo(cutImg);
    
        dstBw = srcBw | (~cutImg);
    }
    
    /// 图片边缘检测
    /// @param srcImage 原始图片
    + (UIImage *)opencvImageEdge:(UIImage *)srcImage {
        //加载图片
        cv::Mat mat_image_src;
        UIImageToMat(srcImage, mat_image_src);
        
        //创建和mat_image_src同样大小的OpenCV图片(Mat)
        cv::Mat mat_image_dst;
        mat_image_dst.create(mat_image_src.size(), mat_image_src.type());
        
        //将图片进行灰度处理(图片变为灰色)
        cv::Mat mat_image_gray;
        cvtColor(mat_image_src, mat_image_gray, cv::COLOR_BGR2GRAY);
        
        //使用3*3内核来降噪处理
        cv::Mat mat_image_edge;
        blur(mat_image_gray, mat_image_edge, cv::Size2i(3, 3));
        
        //进行Canny算子处理
        // 30 20对应的参数可做调整,对轮廓的获取有很大的帮助
    //    Canny(mat_image_edge, mat_image_edge, 30, 20, 3);
        Canny(mat_image_edge, mat_image_edge, 30, 20, 3);
        
        //【4】膨胀操作, 填充边缘缝隙
        cv::Mat element = getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3));
        for (int i = 0;i < 3;i++) {
            dilate(mat_image_edge, mat_image_edge, element);
        }
        
        // 【5】Holes填充
        for (int i = 0;i < 10;i++) // 填充10次
        {
            fillHole(mat_image_edge, mat_image_edge);
        }
        
        //将OpenCV图片->转成iOS图片
        return MatToUIImage(mat_image_edge);
    }
    
    
    @end

    参照文章地址:

    https://blog.csdn.net/guguant/article/details/54428817

    https://github.com/EdenmsX/OpenCVTest/blob/master/OpenCVTestDemo/OpenCVTestDemo/OpenCVImageUtils.mm

    其他

    https://www.cnblogs.com/mangoroom/p/11128738.html opencv滤镜用法

    https://zhuanlan.zhihu.com/p/85813603

    https://www.jianshu.com/p/3aa810b35a5d

  • 相关阅读:
    好久没来园子里转了,最近在学ssh,有个小问题提出来
    ClearType使用的问题
    Metro中访问特定设备的方法
    UMDF驱动程序快速上手
    关于GPS使用上的一个怪异问题
    一个不能创建WINCE6.0工程的问题
    Metro开发小记
    在WINPE中添加驱动
    DOS命令活用
    METRO开发中的多语言处理
  • 原文地址:https://www.cnblogs.com/yuxiaoyiyou/p/13323330.html
Copyright © 2011-2022 走看看