loading...

Called the library created by Go from mruby on Windows and displayed the image of the web camera at the command prompt

kjunichi profile image Junichi Kajiwara ・3 min read

background

I created a library in Go language specifying files and URLs at the Windows command prompt and displaying images at the command prompt

Preparation

The Go side inputs jpeg and png as the input source, as it is, it will call from mruby via the file as it is, worrying about the burden on the SSD w. Of course speed too.

To treat the start address passed from C as a slice of Go

I found this link:

Apparently,

It seems to be nice to write (there seems to be a limitation on the capacity up to 2 GB ..)

func termPutImage(imageData *C.uchar, width, height C.int) {
    len := 3 * width * height
    slice := (*[1 << 30]C.uchar)(unsafe.Pointer(imageData))[:len:len]

To convert to the Image type of Go language

As shown below, we were able to convert the array (P6 format of PPM) received from C side to Image type.

img := image.NewRGBA(image.Rect(0, 0, int(width), int(height)))
for h := 0; h < int(height); h++ {
    for w := 0; w < int(width); w++ {
        r := uint8(slice[3*(h*int(width)+w)])
        g := uint8(slice[3*(h*int(width)+w)+1])
        b := uint8(slice[3*(h*int(width)+w)+2])
        c := color.RGBA{r, g, b, 0}
        img.SetRGBA(w, h, c)
    }
}

To make libhogehoge.a format as Go

On Windows, shared libraries can not be created, but output of archive format libraries is supported.

go build -buildmode = c-archive -o libimgtype.a main.go

This creates a library in .a format. For MinGW's gcc environment, you can use it immediately.

Make MSVC mruby available create a lib file and link

The mrbgem named mruby-webcam we are about to use this time uses the MSVC version of OpenCV, and according to it, we will use MSVC.

Therefore, prepare a def file and generate a. Dll format from this and the .a(archive) format library of the previous. Also, generate the necessary .lib file from .def when linking in MSVC processing system. It will be necessary to do some troublesome work.

How to make a dll

The DLL went with the MinGW version of gcc (gcc specified with cgo).

gcc -m64 -shared -o imgtype.dll imgtype.def libimgtype.a -Wl,--allow-multiple-definition -static -lwinmm -lntdll -lWs2_32 

How to create a lib file

The. lib file is done with the lib command attached to MSVC.

lib /machine:x64 /def:imgtype.def

Now I am ready to integrate into MSVC mruby.

Calling Go from mruby

If you come here, you only write mrbgem. Write the created. Lib file in mrbgem.rake as follows:

spec.linker.flags_before_libraries << "imgtype.lib"

You can pass the path to the imgtype.lib file to the environment variable LIB, and mruby.exe and mirb.exe can be created by incorporating Go library with rake.

To run

This mrb gem is required below:

conf.gembox 'default'
conf.gem '../mruby-webcam'
conf.gem '../mruby-imgtype'
conf.gem :github => 'matsumoto-r/mruby-sleep'  

Below is a mruby script that displays the webcam image at the command prompt or Vim: terminal.

Imgtype.init

cam = Webcam.new
cam.setFmt "ppm"
cam.capture {|img|
  Imgtype.imgtype img
}
while true
    cam.snap
    Sleep::usleep(1000)
    if Imgtype.get_key == "ESC" then
        break
    end
end
Imgtype.close

Result

Imgtype.get_key reads Windows API directly and responds. I was surprised to get key input without polling.

Discussion

markdown guide