m_shige1979のときどきITブログ

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(変なおっさんの顔でるので気をつけてね)

https://github.com/mshige1979

go言語の学習:画像を読み込み、文字を追加

日本語ができない

f:id:m_shige1979:20180729104447j:plain
時間は気にしないでwww

前のソースを一部回収

package main

import (
	"gocv.io/x/gocv"
	"log"
	"os/user"
	"time"
	"io/ioutil"
	"image/color"
	"image"
)

var (
	// サイズ
	w = 640
	h = 480

	// 色定義
	black = color.RGBA{0, 0, 0, 0}
	blue = color.RGBA{0, 0, 255, 0}
	red = color.RGBA{255, 0, 0, 0}
	white = color.RGBA{255, 255, 255, 0}
	yellow = color.RGBA{255, 255, 0, 0}
	color2 = color.RGBA{128,128,128,0}

)

func main() {

	// ユーザディレクトリ取得して保存先を作成
	user, err := user.Current()
	if err != nil {
		log.Println(err)
		return
	}

	// img読み込み
	img_file_path := user.HomeDir + "/Desktop/" + "pug3_pic1.jpg"
	// file
	b, err := ioutil.ReadFile(img_file_path)
	if err != nil {
		log.Println(err)
		return
	}

	// 画像取得
	atom, err := gocv.IMDecode(b, gocv.IMReadUnchanged)
	if err != nil {
		log.Println(err)
		return
	}
	defer atom.Close()

	// sample1描画
	sample1(&atom)

	// 領域作成
	img2 := gocv.NewMatWithSize(atom.Rows(), atom.Cols(), atom.Type())
	// 短径(線)
	gocv.Rectangle(&img2, image.Rect(400, 20, 900, 400), blue, 3)
	// 短径(塗りつぶし)
	gocv.Rectangle(&img2, image.Rect(400, 20, 900, 400), color2, -1)
	// 重ねる
	gocv.AddWeighted(atom, 1, img2, 0.5, 0, &atom)

	// 文字列を出力
	timeStr := time.Now().Format("2006/01/02 15:04:05")
	gocv.PutText(&atom, timeStr, image.Pt(20, atom.Rows() - 40), gocv.FontHersheyComplex, 1, black, 1)

	// 出力画像パス
	file_path := user.HomeDir + "/Desktop/" + time.Now().Format("20060102150405") + ".jpg"

	// 保存
	gocv.IMWrite(file_path, atom)

}

func sample1 (img *gocv.Mat) {

	// 短径描画
	gocv.Rectangle(img,image.Rect(10, 10, 100, 100), black, 5)
	gocv.Rectangle(img,image.Rect(200, 15, 300, 350), blue, 5)
	gocv.Rectangle(img,image.Rect(10, 400, 600, 470), yellow, -1) // -1の場合は塗りつぶし
	gocv.Rectangle(img,image.Rect(40, 350, 550, 450), red, -1) // -1の場合は塗りつぶし

	// 多角形描画
	ps := make([][]image.Point, 1)
	p := make([]image.Point, 4)
	p[0] = image.Pt(int(0.1*float64(w)), int(0.1*float64(h)))
	p[1] = image.Pt(int(0.1*float64(w)), int(0.4*float64(h)))
	p[2] = image.Pt(int(0.3*float64(w)), int(0.2*float64(h)))
	p[3] = image.Pt(int(0.3*float64(w)), int(0.1*float64(h)))
	ps[0] = p
	gocv.DrawContours(img, ps, 0, red, -1) // -1の場合は塗りつぶし

}

使うようになったもの

gocv.IMDecode

→ バイナリを読み込んで変換してくれる

gocv.AddWeighted

→ 既存の短径領域に別の短径領域を重ねる

gocv.PutText

→ 指定の場所にテキストを追加

所感

IDEってやっぱり良いです\(^o^)/
viなどでもなんかできそうですけど、commandキーや入力している間に引数やメソッドの候補がでるのは嬉しい