首页 > 其他分享 >图像修补

图像修补

时间:2023-04-08 10:33:06浏览次数:36  
标签:srcImage1 pt int 图像 修补 previousPoint printf include

#include<iostream>
#include<opencv2/opencv.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/photo/photo.hpp>

using namespace std;
using namespace cv;

#define WINDOW_NAME0 "【原始图参考】"        //为窗口标题定义的宏 
#define WINDOW_NAME1 "【原始图】"        //为窗口标题定义的宏 
#define WINDOW_NAME2 "【修补后的效果图】"        //为窗口标题定义的宏 

Mat srcImage0, srcImage1, inpaintMask;
Point previousPoint(-1, -1);//原来的点坐标
static void ShowHelpText()
{
    //输出欢迎信息和OpenCV版本
    printf("\n\n\t\t\t非常感谢购买《OpenCV3编程入门》一书!\n");
    printf("\n\n\t\t\t此为本书OpenCV3版的第78个配套示例程序\n");
    printf("\n\n\t\t\t   当前使用的OpenCV版本为:" CV_VERSION);
    printf("\n\n  ----------------------------------------------------------------------------\n");

    //输出一些帮助信息
    printf("\n\n\n\t欢迎来到【图像修复】示例程序~\n");
    printf("\n\t请在进行图像修复操作之前,在【原始图】窗口中进行适量的绘制"
        "\n\n\t按键操作说明: \n\n"
        "\t\t【鼠标左键】-在图像上绘制白色线条\n\n"
        "\t\t键盘按键【ESC】- 退出程序\n\n"
        "\t\t键盘按键【1】或【SPACE】-进行图像修复操作 \n\n");
}
static void On_Mouse(int event, int x, int y, int flags, void*)
{
    //鼠标左键弹起消息
    if (event == EVENT_LBUTTONUP || !(flags & EVENT_FLAG_LBUTTON))
        previousPoint = Point(-1, -1);
    //鼠标左键按下消息
    else if (event == EVENT_LBUTTONDOWN)
        previousPoint = Point(x, y);
    //鼠标按下并移动,进行绘制
    else if (event == EVENT_MOUSEMOVE && (flags & EVENT_FLAG_LBUTTON))
    {
        Point pt(x, y);
        if (previousPoint.x < 0)
            previousPoint = pt;
        //绘制白色线条
        line(inpaintMask, previousPoint, pt, Scalar::all(255), 5, 8, 0);
        line(srcImage1, previousPoint, pt, Scalar::all(255), 5, 8, 0);
        previousPoint = pt;
        imshow(WINDOW_NAME1, srcImage1);
    }
}

int main(int argc, char** argv)
{
    //显示帮助文字
    ShowHelpText();

    //载入原始图并进行掩膜的初始化
    Mat srcImage = imread("6.jpg", -1);
    if (!srcImage.data) { printf("读取图片错误,请确定目录下是否有imread函数指定图片存在~! \n"); return false; }
    srcImage0 = srcImage.clone();
    srcImage1 = srcImage.clone();
    inpaintMask = Mat::zeros(srcImage1.size(), CV_8U);
    cout << "11111111";
    //显示原始图参考
    imshow(WINDOW_NAME0, srcImage0);
    //显示原始图
    imshow(WINDOW_NAME1, srcImage1);
    //设置鼠标回调消息
    setMouseCallback(WINDOW_NAME1, On_Mouse, 0);
    //轮询按键,根据不同的按键进行处理
    while (1)
    {
        //获取按键键值
        char c = (char)waitKey();

        //键值为ESC,程序退出
        if (c == 27)
            break;

        //键值为2,恢复成原始图像
        if (c == '2')
        {
            inpaintMask = Scalar::all(0);
            srcImage.copyTo(srcImage1);
            imshow(WINDOW_NAME1, srcImage1);
        }

        //键值为1或者空格,进行图像修补操作
        if (c == '1' || c == ' ')
        {
            Mat inpaintedImage;
            inpaint(srcImage1, inpaintMask, inpaintedImage, 3, INPAINT_TELEA);
            imshow(WINDOW_NAME2, inpaintedImage);
        }
    }

    return 0;
}

 

标签:srcImage1,pt,int,图像,修补,previousPoint,printf,include
From: https://www.cnblogs.com/Lorrained/p/17298079.html

相关文章

  • opencv-python 4.15. 基于分水岭算法的图像分割
    理论任何灰度图像都可以看作是地形表面,其中高强度表示峰和丘陵,而低强度表示山谷。你开始用不同颜色的水(标签)填充每个孤立的山谷(局部最小值)。随着水的上升,取决于附近的峰值(梯度),来自不同山谷的水,明显具有不同的颜色将开始融合。为避免这种情况,你需要在水合并的位置建立障碍。你继续......
  • OpenCV图像像素读写操作
    常用类型介绍uchar类型typedefunsigneduint;typedefsignedcharschar;typedefunsignedcharuchar;typedefunsignedshortushort;Vec系列Vec+数字+字母:C++STLvector容器类似数字:Vec的长度字母:类型b:uchars:shortw:ushorti:intf:floatd:doubletypedefVec<uch......
  • 控制相机采集图像并做处理
    要控制相机采集图像并进行处理,您需要以下步骤:获取相机:要采集图像,您需要一台相机。您可以使用USB相机或使用摄像头模块连接到树莓派或其他嵌入式设备。安装相机驱动程序:如果您使用的是USB相机,则需要安装相应的驱动程序。在Linux系统中,您可以使用V4L2驱动程序进行控制。采......
  • ENVI5.6版本中规则与不规则图像裁剪操作
    图像裁剪的目的是将研究之外的区域去除,常用的是按照行政区划边界或自然区划边界进行图像的裁剪,在基础数据生产中,还经常要做标准分幅裁剪。按照ENVI的图像裁剪过程,可分为规则裁剪和不规则裁剪。ENVI5.6之前版本的图像裁剪工具为SubsetDatafromROIs工具,之后的版本把这个工具移除......
  • 【庖丁解牛】图像处理库: 解决WeCenter至少需要有GD图像处理库才能正常运行
    错误复现以下是安装wecenter时候的报错信息:zmedu致码高胜寒解决方案一[root@xinsz08install]#yuminstallphp-mysqlnd解决方案二如果方案一不管用,建议重新编译php,亲测有效:在从新编译之前先安装依赖包:yum-yinstallcurl-develyum-yinstallpostgresql-develyuminstall......
  • 相机内参在图像裁剪和缩放后的内参变化
    1什么是相机内参相机内参是联系相机坐标系与图像坐标系的桥梁。通过相机内参,可以将相机坐标系中的三维点投影到图像坐标系中的二维点。设相机内参矩阵IM=[[fx,0,cx],[0,fy,cy],[0,0,1]],其中fx,fy为相机焦距。cx,cy为主点的坐标,主点表示相机光轴与成像平面的交点,这是一......
  • 目标图像的HOG特征提取matlab仿真
    1.算法描述HOG特征提取方法就是将一个image(你要检测的目标或者扫描窗口):1)灰度化(将图像看做一个x,y,z(灰度)的三维图像);2)采用Gamma校正法对输入图像进行颜色空间的标准化(归一化);目的是调节图像的对比度,降低图像局部的阴影和光照变化所造成的影响,同时可以抑制噪音的干扰;3)计算图像每个......
  • 目标图像的HOG特征提取matlab仿真
    1.算法描述HOG特征提取方法就是将一个image(你要检测的目标或者扫描窗口): 1)灰度化(将图像看做一个x,y,z(灰度)的三维图像); 2)采用Gamma校正法对输入图像进行颜色空间的标准化(归一化);目的是调节图像的对比度,降低图像局部的阴影和光照变化所造成的影响,同时可以抑制噪音的干扰; 3)计......
  • OpenCV [c++](图像处理基础示例小程序汇总)
    一、图像读取与显示#include<opencv2/opencv.hpp>#include<iostream>usingnamespacecv;usingnamespacestd;intmain(){ stringpath="Resources/lambo.png";//图片的路径名 Matimg=imread(path);//将图片加载后赋值到图像变量img中//if(path.empty()){......
  • 图像向量化_向量存储以及向量搜索和匹配
    图像数据向量化PyTorchpipinstall-itransformerstransformers包又名pytorch-transformers或者pytorch-pretrained-bert。它提供了一些列的STOA模型的实现,包括(Bert、XLNet、RoBERTa等)pytorch_model.binpipinstallsentence-transformers该框架基于......