opencv:图像修复inpaint函数可以编译运行,但是调用时报错。

对原图处理后调用inpaint函数便出现上图报错。

源码在编译运行时没有问题,下面会贴出来,造成报错的原因是原图的格式,我的格式是png的,只需要换一个格式为jpg的原图便可以解决这个问题。

#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/photo/photo.hpp>
#include<iostream>
using namespace cv;
using namespace std;

#define WINDOW_NAME1 "原图"
#define WINDOW_NAME2 "效果图"

static void ShowHelpText();

Mat srcImage1, inpaintMask;
Point previousPoint(-1, -1);

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)
{
    system("color 2F");

    ShowHelpText();

    namedWindow(WINDOW_NAME1, WINDOW_NORMAL);

    //Mat srcImage = imread("F:\\vs2019文件\\图片\\小新不要舔了.png", -1);//错误的源码
    Mat srcImage = imread("F:\\vs2019文件\\图片\\3D欢呼高清图片.jpg", -1);//改正后的
    srcImage1 = srcImage.clone();
    inpaintMask = Mat::zeros(srcImage1.size(), CV_8U);
    imshow(WINDOW_NAME1, srcImage1);

    setMouseCallback(WINDOW_NAME1, On_Mouse, 0);

    while (1)
    {
        char c = (char)waitKey();

        if (c == 27)
            break;
        if (c == '2')
        {
            inpaintMask = Scalar::all(0);
            srcImage.copyTo(srcImage1);
            imshow(WINDOW_NAME1, srcImage1);
        }
        if (c == '1' || c == ' ')
        {

            namedWindow(WINDOW_NAME2, WINDOW_NORMAL);
            Mat inpaintedImage;
            inpaint(srcImage1, inpaintMask, inpaintedImage, 3, INPAINT_TELEA);
            imshow(WINDOW_NAME2, inpaintedImage);

        }
    }
    return 0;
}

static void ShowHelpText()
{

    //输出一些帮助信息
    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");
}
opencv:图像修复inpaint函数可以编译运行,但是调用时报错。

相关文章: