S 2.1修復画像ウィジェット(簡易版)


OpenCVによるinpaint()プレゼンテーション
CV_EXPORTS_W void inpaint( 
    InputArray src, 
    InputArray inpaintMask,
    OutputArray dst, 
    double inpaintRadius, 
    int flags 
);
  • src入力画像
  • inpaintMaskマスク、入力マトリクスと同じsizeの白黒マトリクス.白は興味のあるエリアを表します.ここでは修復が必要な領域を指します.
  • dst出力画像
  • inpaintRadiusはレンダリング半径で、一般的には小半径3で、大半径はぼやけやすい.
  • flags修復方法、2種類あります:INPAINT_NSとINPAINT_TELEA.
  • #include 
    using namespace cv;
    int main()
    {
        Mat src = imread("images/favorite/cat.jpg");
        Mat dst;
    
        Rect rect0(624, 655, 400, 20);//               
    
        Mat mask = Mat::zeros(src.size(), CV_8UC1);
        mask(rect0).setTo(255);
    
        inpaint(src, mask, dst, 3, INPAINT_NS);
    
        imshow("mask", mask);
        imshow("src", src);
        imshow("dst", dst);
    
        waitKey(0);
        return 0;
    }
    

    グラフィックプログラム
    マウスコールバック関数の作成
    CV_EXPORTS void setMouseCallback(const String& winname, MouseCallback onMouse, void* userdata = 0);
    
    #include 
    
    using namespace cv;
    
    Mat mask_board;
    int width = 5;
    int paint_or_wipe = 1;
    
    void draw_dot(int event, int x, int y, int flags, void *ustc)
    {
        Scalar color;
        if(paint_or_wipe)
            color = (255);
        else
            color = (0);
        if(event == EVENT_LBUTTONDOWN)
            rectangle(mask_board, Point(x-width/2, y-width/2), Point(x+width/2, y+width/2), color, -1);
        if(event == EVENT_MOUSEMOVE and flags == EVENT_FLAG_LBUTTON)
            rectangle(mask_board, Point(x-width/2, y-width/2), Point(x+width/2, y+width/2), color, -1);
    }
    
    int main()
    {
        Mat src = imread("images/favorite/cat.jpg");
        mask_board = Mat::zeros(src.size(), CV_8UC1);
    
        imshow("mask_board", mask_board);
        setMouseCallback("mask_board", draw_dot);
        int k = 1;
        createTrackbar("paint_or_wipe", "mask_board", &k, 1);
    
        while (1)
        {
            paint_or_wipe = k;
    
            imshow("mask_board", mask_board);
    
            if(waitKey(1) == 'q')
                break;
        }
    
        return 0;
    }
    

    透かしを取り除く小道具を作る
    OpenCVに付属のhighguiを利用して小さなアプリケーションを作り、マウスで透かしの位置を描き、透かしを除去することをサポートします.
    #include 
    
    using namespace cv;
    
    Mat mask_board;
    const int width = 7;
    int paint_or_wipe = 1;
    int show = 1;
    
    void draw_dot(int event, int x, int y, int flags, void *ustc)
    {
        Scalar color;
        if(paint_or_wipe)
            color = (255);
        else
            color = (0);
        if(event == EVENT_LBUTTONDOWN or (event == EVENT_MOUSEMOVE and flags == EVENT_FLAG_LBUTTON))
            rectangle(mask_board, Point(x - width / 2, y - width / 2), Point(x + width / 2, y + width / 2), color, -1);
    
    }
    
    int main()
    {
        Mat src = imread("images/favorite/my.jpg");
        Mat dst;
        mask_board = Mat(src.size(), CV_8UC1, Scalar(0));
    
        imshow("image", src);
        setMouseCallback("image", draw_dot);
        createTrackbar("paint_or_wipe", "image", &paint_or_wipe, 1);
        createTrackbar("show", "image", &show, 1);
    
        while (1)
        {
            if(waitKey(1) == 'q')
                break;
    
            inpaint(src, mask_board, dst, 3, INPAINT_NS);
            if(!show)
                bitwise_and(src, Scalar(0, 0, 0), dst, mask_board);
    
            imshow("image", dst);
        }
    
        waitKey(0);
        return 0;
    }
    

    (完)