Передача изображения из оболочки Python в функцию C ++ - PullRequest
0 голосов
/ 15 марта 2019

Я хочу передать изображение из кода Python в функцию C ++. Моя функция c ++ находится в файле .so и загружается в python с использованием ctypes. Функция c ++ принимает аргумент типа Mat. Аргумент (то есть изображение) передается из Python (используя opencv).

Когда я пытаюсь запустить вышеуказанный сценарий, он выдает ошибку, как показано ниже;

ctypes.ArgumentError: аргумент 1:: не знаю, как преобразовать параметр 1

Мой код указан ниже: test.py

import cv2
from ctypes import *

testso = CDLL("./libvideoread.so")
cap = cv2.VideoCapture("Bigbunny.mp4")
if(cap.isOpened == False):
    print("error")
else:
    frame_width = int(cap.get(3))
    frame_height = int(cap.get(4))
    cv2.namedWindow('frame',cv2.WINDOW_NORMAL)
    while(cap.isOpened):
       ret,frame = cap.read()
       if ret:
          testso.imgread(frame)
       else:
           break

cap.release()
cv2.destroyAllWindows()

код cpp:

void imgread(Mat frame)
{
     /*Do something*/
}

Проверен на наличие ошибки в сети и обнаружен, что Opencv-python преобразует данные изображения в массив numpy. А Opencv-c ++ использует тип Mat. Так как же я могу преобразовать массив NumPy в тип Mat или передать изображение из Python в функцию C ++.

Я не хочу использовать Boost :: python

Спасибо.

1 Ответ

0 голосов
/ 29 мая 2019

Я наконец разобрался с решением проблемы.

Мне пришлось преобразовать формат мата в массив numpy. и передать этот массив в качестве аргумента функции cpp imgread () .

Функция cpp imgread () должна получить его как указатель на символ и затем преобразовать его в mat.

Модифицированный test.py;

import cv2
from ctypes import *

testso = CDLL("./libvideoread.so")
cap = cv2.VideoCapture("Bigbunny.mp4")
if(cap.isOpened == False):
    print("error")
else:
    frame_width = int(cap.get(3)) # Width is 1280
    frame_height = int(cap.get(4)) # Height is 720
    cv2.namedWindow('frame',cv2.WINDOW_NORMAL)
while(cap.isOpened):
   ret,frame = cap.read()
   if ret:
      # Next 3 lines convert frame data to numpy array
      testarray1 = np.fromstring(frame, np.uint8) 
      testarray2 = np.reshape(testarray1, (720, 1280, 3))
      framearray = testarray2.tostring()

      #Send framearray to the cpp function.
      testso.imgread(framearray)
   else:
       break

 cap.release()
 cv2.destroyAllWindows()

На стороне cpp;

void imgread(unsigned char* framedata)
{
  cv::Mat frame(cv::Size(1280,720), CV_8UC3, framedata);
   /*Do something*/
}

Приветствие.

...