基于OpenCV的抠图程序

这篇博客详细介绍了如何运用C++和OpenCV库读取文件夹中的图片,实现在图片上通过鼠标选择矩形区域,并将选定部分自动保存为新的文件。同时,该程序还结合了Qt用于图形界面交互。
摘要由CSDN通过智能技术生成
    最近为了建立图片数据库,要进行抠图,在使用了Windows自带的截图软件之后,发现非常的麻烦,每次都要直接打开图片,抠图,然后还要输入保存的文件名字,这种纯手工的方式,要多长时间才能搞定十万张图片。
    本着能偷懒就偷懒的想法,在实际的数据库建立过程中,打开一个目录下面的文件和将抠出来的图保存下来的过程,根本不需要人的参与,因为这两部分都可以由程序自己来完成,因此,就产生了基于OpenCV的抠图程序。




    要解决在每个文件夹下面的图片都进行处理,需要解决下面三个问题:
  1. 读取一个文件夹下面的所有文件;
  2. 显示图片,并获得鼠标在图片上面选择的矩形框;
  3. 自动生成文件的名字并保存选择的区域。

    对于第一个问题,已经在另外一个博客中描述了。
    对于第二个问题,通过查看OpenCV的帮助文档可以知道,可以通过setMouseCallback函数在图片显示窗口中添加鼠标事件的回调函数,从而获得鼠标的坐标,同时也能获得鼠标的事件,例如鼠标右键点击、左键点击和鼠标移动等事件。通过将鼠标左键点击时的坐标作为开始点的坐标,将鼠标左键释放时的坐标作为结束点的坐标,并通过一定的处理,将
    对于第三个问题,文件的名字可以使用数字的表示,而保持选定的区域,可以通过将选定的区域设置为图片的ROI,从而使用OpenCV的imwrite函数将ROI区域保存为图片的格式。

    具体的实现代码如下:
    functions.h
/*M///
// Copyright (c) 2014, sheng
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
//     * Redistributions of source code must retain the above copyright notice,
//       this list of conditions and the following disclaimer.
//
//     * Redistributions in binary form must reproduce the above copyright notice,
//       this list of conditions and the following disclaimer in the documentation
//       and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
//M*/



#ifndef FUNCTIONS_H
#define FUNCTIONS_H

#include <QStringList>
#include <string>
#include "opencv2/opencv.hpp"

QStringList GetFilesInDirectory(const QString &Directory);

bool SaveImageInJPEG(const std::string& FileName, const cv::Mat& Image);

bool Screenshot(cv::Mat Image, const std::string& FileName,
                const int& StartedX, const int& StartedY,
                const int& EndedX, const int& EndedY);

void OnMouse( int Event, int X, int Y, int flag, void* Userdata);


std::string IntToString(int value);

bool DrawRectangle(cv::Mat& Image, const int& StartedX, const int& StartedY,
                   const int& EndedX, const int& EndedY,
                   const cv::Scalar& Color = cv::Scalar(255,0,0),
                   int Thickness = 2, int LintType = 8);

bool MakingRectanglePoint(int& StartedX, int& StartedY,
                          int& EndedX, int& EndedY);

#endif // FUNCTIONS_H

   userdata.h
/*M///
// Copyright (c) 2014, sheng
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
//     * Redistributions of source code must retain the above copyright notice,
//       this list of conditions and the following disclaimer.
//
//     * Redistributions in binary form must reproduce the above copyright notice,
//       this list of conditions and the following disclaimer in the documentation
//       and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
//M*/




#ifndef USERDATA_H
#define USERDATA_H

#include <string>
#include "opencv2/opencv.hpp"

/**
 * @brief The UserData struct Use to contain the window name and the image.
 *
 * @author sheng
 * @date   2014-08-27
 * @version 0.1
 *
 * @history
 *     <author>       <date>         <version>        <description>
 *      
以下是基于opencv4.5.1 c实现智能抠图的代码: ```c #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main() { // 读取图像 Mat image = imread("image.jpg"); // 创建掩码图像 Mat mask = Mat::zeros(image.size(), CV_8UC1); // 创建矩形ROI Rect r(100, 100, 300, 300); // 在掩码中画出ROI rectangle(mask, r, Scalar(255), FILLED); // 创建GrabCut算法需要的输入图像 Mat bgModel, fgModel; Mat grabcutInput; image.copyTo(grabcutInput); // 运行GrabCut算法 grabCut(grabcutInput, mask, r, bgModel, fgModel, 5, GC_INIT_WITH_RECT); // 创建前景掩码 Mat fgMask = (mask == GC_FGD) | (mask == GC_PR_FGD); // 将前景掩码应用于原始图像 Mat result; image.copyTo(result, fgMask); // 显示原始图像和抠图结果 imshow("Original", image); imshow("Result", result); waitKey(); return 0; } ``` 代码解析: 1. 首先,包含了需要的头文件和命名空间。 2. 然后,读取了一张图像并创建了一个掩码图像。 3. 接着,创建了一个矩形ROI并在掩码中画出了该矩形。 4. 创建了GrabCut算法所需的输入图像,并运行了GrabCut算法。 5. 创建了前景掩码并将其应用于原始图像。 6. 最后,显示原始图像和抠图结果,并等待用户按下任意键结束程序。 这段代码实现的是基于GrabCut算法的智能抠图方法,可以根据用户提供的矩形ROI进行抠图。在这个例子中,我们将矩形ROI设置为(100, 100, 300, 300)。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值