-
Notifications
You must be signed in to change notification settings - Fork 26
/
Copy pathinpaint.go
95 lines (79 loc) · 2.08 KB
/
inpaint.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
// Copyright 2011 <chaishushan@gmail.com>. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// +build ingore
package main
import (
"fmt"
"log"
"os"
"github.com/chai2010/opencv"
)
func main() {
filename := "../testdata/fruits.jpg"
if len(os.Args) == 2 {
filename = os.Args[1]
}
img0 := opencv.LoadImage(filename)
if img0 == nil {
log.Fatalf("LoadImage %s failed!", filename)
}
defer img0.Release()
fmt.Print("Hot keys: \n",
"\tESC - quit the program\n",
"\tr - restore the original image\n",
"\ti or ENTER - run inpainting algorithm\n",
"\t\t(before running it, paint something on the image)\n",
)
img := img0.Clone()
inpainted := img0.Clone()
inpaint_mask := opencv.CreateImage(img0.GetWidth(), img0.GetHeight(), 8, 1)
opencv.Zero(inpaint_mask)
//opencv.Zero( inpainted )
win := opencv.NewWindow("image")
defer win.Destroy()
prev_pt := opencv.Point{-1, -1}
win.SetMouseCallback(func(event, x, y, flags int, param ...interface{}) {
if img == nil {
os.Exit(0)
}
if event == opencv.CV_EVENT_LBUTTONUP ||
(flags&opencv.CV_EVENT_FLAG_LBUTTON) == 0 {
prev_pt = opencv.Point{-1, -1}
} else if event == opencv.CV_EVENT_LBUTTONDOWN {
prev_pt = opencv.Point{x, y}
} else if event == opencv.CV_EVENT_MOUSEMOVE &&
(flags&opencv.CV_EVENT_FLAG_LBUTTON) != 0 {
pt := opencv.Point{x, y}
if prev_pt.X < 0 {
prev_pt = pt
}
rgb := opencv.ScalarAll(255.0)
opencv.Line(inpaint_mask, prev_pt, pt, rgb, 5, 8, 0)
opencv.Line(img, prev_pt, pt, rgb, 5, 8, 0)
prev_pt = pt
win.ShowImage(img)
}
})
win.ShowImage(img)
opencv.WaitKey(0)
win2 := opencv.NewWindow("inpainted image")
defer win2.Destroy()
win2.ShowImage(inpainted)
for {
key := opencv.WaitKey(20)
if key == 27 {
os.Exit(0)
} else if key == 'r' {
opencv.Zero(inpaint_mask)
opencv.Copy(img0, img, nil)
win.ShowImage(img)
} else if key == 'i' || key == '\n' {
opencv.Inpaint(img, inpaint_mask, inpainted, 3,
opencv.CV_INPAINT_TELEA,
)
win2.ShowImage(inpainted)
}
}
os.Exit(0)
}