广告
返回顶部
首页 > 资讯 > 精选 >OpenCV实现抠图工具的代码是什么
  • 610
分享到

OpenCV实现抠图工具的代码是什么

2023-06-26 07:06:36 610人浏览 独家记忆
摘要

今天就跟大家聊聊有关OpenCV实现抠图工具的代码是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。在计算机图像领域,我们经常需要做一些抠图的工作,将图像中的目标感兴趣区域提取出来

今天就跟大家聊聊有关OpenCV实现抠图工具的代码是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

在计算机图像领域,我们经常需要做一些抠图的工作,将图像中的目标感兴趣区域提取出来,剔除其他冗余的背景元素,以实现计算机视觉的各项功能(如车辆检测、人脸检测等)。如果纯粹使用美图秀秀等工具类软件的话,由于工具类软件将图像处理中各种可能用到的功能都集成在了一起,所以纯粹做抠图的话效率很低。现在我们就用 OpenCV 来实现一段简易的抠图程序,只需要在画面上选定目标的感兴趣区域,该目标就会被自动按序号保存。

代码如下,同时包含有通俗易懂的注释:

#include <io.h>#include <coNIO.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <opencv.hpp> // 抠图是单目标还是多目标,若为单目标请将下面这行文字取消注释,反之请注释这段文字。// #define SINGLE_OBJECT #define TRUE 1     // 逻辑真#define FALSE 0   // 逻辑假 #define CODE_ESC 27     // ESC 键的编码#define CODE_SPC 32    // 空格键的编码 #define STATUS_WaiT 0  // 抠图等待状态#define STATUS_PROC 1     // 抠图进行状态#define STATUS_DONE 2    // 抠图完成状态 #define VIDEO_FILENAME "capture-1.mp4"          // 视频流文件名 static int m_x1     = 0;    // 鼠标指针坐标(起点 x)static int m_x2     = 0;    // 鼠标指针坐标(终点 x)static int m_y1     = 0;    // 鼠标指针坐标(起点 y)static int m_y2     = 0;     // 鼠标指针坐标(终点 y)static int m_status = STATUS_WAIT;              // 当前抠图状态指示 static void on_mouse(int, int, int, int, void*);// 鼠标回调 // 主程序int main(void){    int        end    = 0;         // 指示是否结束程序    int        next   = 0;         // 指示是否切换到下一张图片    int        code   = 0;        // 存储按键编码    int        count  = 0;        // 存储目标计数    int        frame  = 0;         // 视频帧号(用于间隔采样)    int        maxCol = 0;             // 图像最大列数(= 图像宽度 - 1)    int        maxRow = 0;                      // 图像最大行数(= 图像高度 - 1)    CvCapture* pVideo = NULL;          // 视频流对象    IplImage*  pFrame = NULL;           // 视频帧图像(用于样本存储)    IplImage*  pFrmCp = NULL;           // 视频帧图像(用于屏幕显示)    CvPoint    pt1    = cvPoint(0, 0);          // 矩形框对角坐标点 1    CvPoint    pt2    = cvPoint(0, 0);          // 矩形框对角坐标点 2    CvRect     r      = cvRect(0, 0, 0, 0);     // 感兴趣区域矩形框    char       seq[]  = "-2147483648";          // 目标计数的字串形式    char       fil[]  = "data\\-2147483648.jpg";// 文件名字串     // 载入视频流    pVideo = cvCreateFileCapture(VIDEO_FILENAME);    if (!pVideo)    {        return -1;    } // if (!pVideo)     // 创建数据存储目录    if (_access("data", 0) != 0)    {        system("md data");    } // if (_access())     // 获取首帧图像,并创建拷贝,同时得到最大列数和行数,方便之后使用    pFrame = cvQueryFrame(pVideo);    if (pFrame)    {        pFrmCp = cvCreateImage(cvGetSize(pFrame), 8, pFrame->nChannels);        maxCol = pFrmCp->width - 1;        maxRow = pFrmCp->height - 1;    } // if (pFrame)    else    {        cvReleaseCapture(&pVideo);        return -1;    } // else     // 设置显示窗口,并设置鼠标回调    cvNamedWindow("Monitor", CV_WINDOW_AUTOSIZE);    cvSetMouseCallback("Monitor", on_mouse, NULL);     // 其他初始化    end = FALSE;    count = 0;    frame = 0;     while (!end && pFrame)    {        next = FALSE;        while (!next && !end)        {            // 将原始视频图像复制到拷贝区域中(清除已将图像进行污染的线条、矩形框等)            cvCopy(pFrame, pFrmCp, NULL);            if (STATUS_WAIT == m_status)            {                // 等待抠图状态。画出横向和纵向的参考线                cvLine(pFrmCp, cvPoint(m_x1, 0), cvPoint(m_x1, maxRow), CV_RGB(0, 255, 0));                cvLine(pFrmCp, cvPoint(0, m_y1), cvPoint(maxCol, m_y1), CV_RGB(0, 255, 0));            } // if (STATUS_WAIT)            else if (STATUS_PROC == m_status)            {                // 抠图过程中。画出当前选定的感兴趣区域                pt1 = cvPoint(m_x1, m_y1);                pt2 = cvPoint(m_x2, m_y2);                cvRectangle(pFrmCp, pt1, pt2, CV_RGB(0, 255, 0));            } // else if (STATUS_PROC)            else if (STATUS_DONE == m_status)            {                // 抠图完毕,获得感兴趣区域并按编号保存样本                r = cvRect(                    m_x1,                    m_y1,                    m_x2 - m_x1 + 1,                    m_y2 - m_y1 + 1                    ); // 矩形感兴趣区域                if (r.width > 30 && r.height > 30)                {                    // 区域达到了一定大小,抠图有效,保存感兴趣区域样本                    ++count;                    cvSetImageROI   (pFrame, r);                    sprintf_s       (seq, "%d", count);                    strcpy_s        (fil, "data\\");                    strcat_s        (fil, seq);                    strcat_s        (fil, ".jpg");                    cvSaveImage     (fil, pFrame, 0);                    cvResetImageROI (pFrame); #ifdef SINGLE_OBJECT                    m_next = TRUE;#endif                } // if (r.width)                                // 恢复抠图等待状态                m_status = STATUS_WAIT;            } // else if (STATUS_DONE)             cvShowImage("Monitor", pFrmCp);            code = cvWaiTKEy(10);            if (CODE_SPC == code)            {                next = TRUE;            } // if (CODE_SPC)            else if (CODE_ESC == code)            {                end = TRUE;            } // else if (CODE_ESC)        } // while (!next)         if (next)        {            do            {                pFrame = cvQueryFrame(pVideo);                ++frame;            } while (pFrame && frame % 60 != 0); // do...while        } // if (next)    } // while (!end)     cvDestroyAllwindows();    cvReleaseImage(&pFrmCp);    cvReleaseCapture(&pVideo);     return 0;} // main()  // 鼠标事件回调void on_mouse(int event, int x, int y, int flags, void* param){    switch (flags)    {    case CV_EVENT_MOUSEMOVE:        if (STATUS_WAIT == m_status)        {            // 等待状态,确定感兴趣区域起点            m_x1 = x, m_y1 = y;        } // if (STATUS_WAIT)        else if (STATUS_PROC == m_status)        {            // 捕捉状态,确定感兴趣区域终点            m_x2 = x, m_y2 = y;        } // else if (STATUS_PROC)        break;     case CV_EVENT_LBUTTONDOWN:        if (STATUS_WAIT == m_status)        {            // 等待状态按下鼠标,进入捕捉状态,固定起点            m_x1 = x, m_y1 = y;            m_status = STATUS_PROC;        } // if (STATUS_WAIT)        else if (STATUS_PROC == m_status)        {            // 捕捉状态按下鼠标,捕捉完成,固定终点            m_x2 = x, m_y2 = y;            m_status = STATUS_DONE;        } // else if (STATUS_PROC)        break;    } // switch} // on_mouse()

看完上述内容,你们对OpenCV实现抠图工具的代码是什么有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网精选频道,感谢大家的支持。

--结束END--

本文标题: OpenCV实现抠图工具的代码是什么

本文链接: https://www.lsjlt.com/news/307423.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • OpenCV实现抠图工具的代码是什么
    今天就跟大家聊聊有关OpenCV实现抠图工具的代码是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。在计算机图像领域,我们经常需要做一些抠图的工作,将图像中的目标感兴趣区域提取出来...
    99+
    2023-06-26
  • OpenCV实现抠图工具
    本文实例为大家分享了OpenCV实现抠图工具的具体代码,供大家参考,具体内容如下 在计算机图像领域,我们经常需要做一些抠图的工作,将图像中的目标感兴趣区域提取出来,剔除其他冗余的背景...
    99+
    2022-11-13
  • OpenCV+Qt实现图像处理操作工具的示例代码
    目录一、目标二、使用Qt界面三、图像处理操作完整代码一、目标 Qt界面实现 雪花屏 高斯模糊 中值滤波 毛玻璃 灰度化 XY方向模糊 双边模糊 腐蚀 [图像处理操作] 要求左边原图,...
    99+
    2022-11-13
    OpenCV Qt图像处理 OpenCV 图像处理 Qt 图像处理
  • Python实现一键抠图的示例代码
    目录需求来源实现方法需求来源 好友 A:橡皮擦,可否提供网页,上传带人像的图片,然后可以直接抠图,最好直接生成 PNG 图片下载。 橡皮擦:每天需要调用多少次? 好友 A:大概 10...
    99+
    2022-11-11
  • linux代码工具是什么
    这篇文章主要介绍linux代码工具是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!linux代码工具有:1、Eclipse;2、LightTable;3、Sublime Text;4、Brackets;5、Dar...
    99+
    2023-06-21
  • Java实现截图小工具的完整代码
    目录写在前面效果展示代码展示项目结构设计思路项目测试写在前面 今天利用Java的图形用户界面GUI技术写了一个电脑截图小工具。本程序代码简单,涉及到异常处理,事件处理,图形用户界面等...
    99+
    2022-11-13
  • Java实现屏幕截图工具的代码怎么写
    这篇文章主要讲解了“Java实现屏幕截图工具的代码怎么写”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java实现屏幕截图工具的代码怎么写”吧!效果展示程序运行后的截图:先测试一下功能:截图...
    99+
    2023-06-30
  • OpenCV是怎么实现简单套索工具
    这篇文章将为大家详细讲解有关OpenCV是怎么实现简单套索工具,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Photoshop中的套索工具通过鼠标多次点击可以选中一个任意多边形的区域,然后单...
    99+
    2023-06-26
  • Java实现屏幕截图工具的代码分享
    目录效果展示程序结构核心代码效果展示 程序运行后的截图: 先测试一下功能: 截图过程对界面的捕捉: 双击保存后的显示界面: 后续的步骤就自己去尝试吧,这里给出了简单的测试过程。...
    99+
    2022-11-13
  • Java实现抠图片文字或签名的完整代码
    目录java抠图片文字或签名运行原理完整代码java抠图片文字或签名 运行原理 第一步 遍历像素点 BufferedImage image = ImageIO.read(new Fi...
    99+
    2022-11-13
  • mybatis plus代码生成工具的实现代码
    前言: 原本想使用AutoGenerator 是 MyBatis-Plus 的官方代码生成器 ,尝试了一下,竟然报错,原因可能是MyBatis-Plus和mybatis-p...
    99+
    2022-11-12
  • openCV实现图像融合的示例代码
    目录1. 概念2. 流程3 代码1. 概念 图像融合: 两幅图片叠加在一起,形成前景背景的效果。 2. 流程 (1)读入要融合的两幅图片。(2)把两幅图片调整到统一大小,方便下一步叠...
    99+
    2022-11-13
  • 基于Python实现千图成像工具的示例代码
    目录前置GUI制作GUI界面设计逻辑设计图片处理修改底图大小修改组图大小计算图片填充次数组图合成图片合成GUI打包千图成像也就是用N张图片组成一张图片的效果。制作方法有很多的,最常见...
    99+
    2022-11-11
  • 基于Opencv的图像卡通化实现代码
    OpenCV的全称是:Open Source Computer Vision Library。OpenCV是一个基于(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windo...
    99+
    2022-11-12
  • ABAP和Hybris的源代码生成工具是什么
    本篇内容介绍了“ABAP和Hybris的源代码生成工具是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!ABAP有两种方式,一种是ABAP...
    99+
    2023-06-04
  • 3行代码5秒抠图的AI神器,PS什么的靠边了
    曾几何时,「抠图」是一个难度系数想当高的活儿,但今天要跟大家介绍的这和抠图工具,只要 3 行代码 5 秒钟就可以完成高精度抠图,甚至都不用会代码,点两下鼠标就完成了。感受下这款抠图工具抠地有多精细:...
    99+
    2023-06-02
  • Android实现下载工具的简单代码
    下载应该是每个App都必须的一项功能,不采用第三方框架的话,就需要我们自己去实现下载工具了。如果我们自己实现可以怎么做呢? 首先如果服务器文件支持断点续传,则我们需要实现的主要...
    99+
    2022-06-06
    工具 Android
  • 代理IP工具指的是什么
    小编给大家分享一下代理IP工具指的是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、IP地址分为动态和静态两种。中国庞大的网络需求与短缺的知识产权地址资源成...
    99+
    2023-06-20
  • OpenCV 图像分割实现Kmean聚类的示例代码
    目录1 Kmean图像分割2 流程3 实现1 Kmean图像分割 按照Kmean原理,对图像像素进行聚类。优点:此方法原理简单,效果显著。缺点:实践发现对于前景和背景颜色相近或者颜色...
    99+
    2022-11-13
  • C++OpenCV实现灰度图蒙版GrayMask的示例代码
    目录需求说明具体流程功能函数C++测试代码测试效果需求说明 在对图像进行处理时,经常会有这类需求:想对感兴趣区域进行掩膜处理,只操作掩膜内数据,此时需要搭配掩膜绘制功能,并在绘制过程...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作