Boost Python не может передать изображение из Python в C ++ - PullRequest
0 голосов
/ 17 марта 2019

Я пытаюсь передать изображение из python в C ++, используя boost.python.Вот мой код Python:

import cv2
imgs = []
img1 = cv2.imread('img1.jpg')
img2 = cv2.imread('img2.jpg') 
imgs.append(img1)
imgs.append(img2)   
frame_size = imgs[0].shape[:2]
new_img = imwriteInC(imgs, frame.size[1], frame.size[0])

Вот код C ++:

#include <iostream>
#include <boost/pythong.hpp>
#include <Python.h>
using namespace cv;

bp::list imwriteInC(bp::list frames, int img_width, int img_height){
    Mat input_frame, new_frame;

    const char* first_frame = bp::extract<const char*>(bp::str(frames[0]));

    input_frame = Mat(img_height, img_width, CV_8UC3);  

    new_frame.create(input_frame.size(), CV_8UC3);
    size_t memsize = 3 * img_height * img_width;
    memcpy(new_frame.data, first_frame, memsize));

    imwrite("cImage.png", new_frame); 
    ...
    return outputList
}

Исходное изображение должно быть:

enter image description here

Однако, после передачи этого изображения в C ++, результат imwrite становится

enter image description here

Я не очень хорош в C ++.Кто-нибудь может указать, как это исправить?Заранее спасибо!

1 Ответ

0 голосов
/ 19 марта 2019

Похоже, cv2 изображения предоставляют свои данные через буферный протокол.На уровне C имеется набор функций , которые вы можете использовать для доступа к этим данным.

Пример использования без проверки ошибок:

// get data into a buffer and check the size
Py_buffer view;
PyObject_GetBuffer(frames[0], &view, PyBUF_SIMPLE);
size_t memsize = 3 * img_height * img_width;
assert( memsize == view.len );

// copy data from buffer
Mat input_frame;
input_frame = Mat(img_height, img_width, CV_8UC3);
memcpy(input_frame.data, view.buf, memsize);

// release buffer
PyBuffer_Release(&view);
...