【プログラミング覚書】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; }
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: