2022年走行記録

01/10 30 30 からっ風街道30Km 02/25 64 94 箕郷梅林から永井食堂64Km 02/28 75 169 秋間梅林〜榛名梅林〜箕郷梅林75Km 03/14 80 249 箕郷梅林〜榛名梅林〜秋間梅林80Km 03/20 70 319 箕郷梅林〜榛名梅林70Km 03/30 95 414 休泊川95Km 04/01 64 478 桐生が岡公園64Km 04/05 53 531 大沢川53Km 04/06 88 619 妙義神社88Km 04/25 108 727 奥四万湖108Km

【プログラミング覚書】PythonからC言語の関数を呼び出す

sample.py

# -*- coding: utf-8 -*-
#!/usr/bin/python

import sys
import ctypes
import numpy as np
import cv2

def overlayImage(filename, overlayfile,winname='WinName'):
    cv2.namedWindow(winname,cv2.WINDOW_KEEPRATIO | cv2.WINDOW_GUI_NORMAL )
    cv2.setWindowProperty(winname, cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)
    src_image = cv2.imread(filename)
    overlay_image = cv2.imread(overlayfile)
    src_height, src_width = src_image.shape[:2]
    ol_height, ol_width = overlay_image.shape[:2]
    posX = 100
    posY = 100
    src_image = src_image.astype(np.uint8)
    overlay_image = overlay_image.astype(np.uint8)
    src_image2 = src_image.ctypes.data_as(ctypes.POINTER(ctypes.c_ubyte))
    overlay_image = overlay_image.ctypes.data_as(ctypes.POINTER(ctypes.c_ubyte))
    PATH = './cvlib.so'
    lib = ctypes.cdll.LoadLibrary(PATH)
    lib.cvlib_overlay(src_image2, overlay_image, src_height, src_width,ol_height, ol_width, posX, posY)
    cv2.imshow(winname,src_image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()


if __name__ == '__main__':
    args = sys.argv
    if len(args) < 3:
        print('Usage:%s baseimg overimg  %d' % (args[0], len(args)))
        exit(0)
    overlayImage(args[1], args[2],winname='WinName')
# end of main

cvlib.cpp

#include <stdio.h>

extern "C" int cvlib_overlay(unsigned char *s_img, unsigned char *o_img, int s_h, int s_w,int o_h, int o_w, int posX, int posY)
{
    //printf("sw=%d sh=%d ow=%d oh=%d posx=%d posy=%d\n",s_w, s_h, o_w, o_h, posX, posY);
    unsigned int count = 0; // 上書きした画素数
    int bs_pos;         // ベース画像の画素位置
    int ol_pos;         // 上書き画像の画素位置
    int b;              // Blue値
    int g;              // Green値
    int r;              // Reg値
    int xpos;           // ベース画像の上書き位置(x)
    int ypos = posY;    //                       (y)
    int x, y;
    for( y = 0; y < o_h; y++ ) {
        xpos = posX;
        for( x = 0; x < o_w; x++ ) {
            bs_pos = ( ypos * s_w + xpos) * 3;  // ベース画像に上書きする画素位置
            ol_pos = (y * o_w + x ) * 3;        // 上書き画像から画素を取り出す位置
            // 画素値をBGRで取り出す
            b = o_img[ol_pos+0];
            g = o_img[ol_pos+1];
            r = o_img[ol_pos+2];
            if( ( b <= 10 ) && ( g <= 10 ) && ( r >= 245 ) ){
                ;   // 指定値はベース画像をそのまま使用する
            } else {
                    // その他の場合は上書き画像で上書きする
                s_img[bs_pos+0] = b;
                s_img[bs_pos+1] = g;
                s_img[bs_pos+2] = r;
                count += 1;     // 上書きした画素数
            }
            xpos += 1;
        }
        ypos += 1;
    }
    return count;
}

Makefile

SRCS := cvlib.cpp 
OBJS :=  $(SRCS:.cpp=.o)
EXENAME := cvlib.so

CC := gcc
LDLIBS := -lm
LDFLAGS := -shared
CFLAGS := -g -Wall -fPIC


all: $(EXENAME)

.cpp.o:
    $(CC) $(CFLAGS) -c $^ -o $@

$(EXENAME): $(OBJS)
    $(CC)  $(LDFLAGS) $^ -o $@ 

clean:
    rm -f *.o
    rm -f $(EXENAME)

install: