我在opencv中有一个c ++ facerecognition代码和一个python代码。在python代码中,我从机器人中读取帧,我想将此fram发送到我的c ++代码。 我在c ++函数中使用this link调用python函数。
我的c ++函数是embed.cpp:
#include <Python.h>
#include <stdlib.h>
#include "opencv2/core/core.hpp"
#include "opencv2/contrib/contrib.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
#include <fstream>
#include <sstream>
#include </home/nao/Desktop/python/boost_1_61_0/boost/python/extract.hpp>
#include </home/nao/Desktop/python/boost_1_61_0/boost/python/converter/registry.hpp>
namespace py = boost::python;
int main()
{
// Set PYTHONPATH TO working directory
setenv("PYTHONPATH",".",1);
PyObject *pName, *pModule, *pDict, *pFunc, *pValue, *presult;
// Initialize the Python Interpreter
Py_Initialize();
// Build the name object
pName = PyString_FromString((char*)"alvideo2");
// Load the module object
pModule = PyImport_Import(pName);
// pDict is a borrowed reference
pDict = PyModule_GetDict(pModule);
// pFunc is also a borrowed reference
pFunc = PyDict_GetItemString(pDict, (char*)"showNaoImage");
if (PyCallable_Check(pFunc))
{
pValue=Py_BuildValue("(z)",(char*)"something");
PyErr_Print();
printf("Let's give this a shot!\n");
presult=PyObject_CallObject(pFunc,pValue);
PyErr_Print();
} else{
PyErr_Print();
}
cv::imshow("Original_image",presult);
cvWaitKey(0);
Py_DECREF(pValue);
// Clean up
Py_DECREF(pModule);
Py_DECREF(pName);
// Finish the Python Interpreter
Py_Finalize();
return 0;
}
我的python代码是alvideo2.py:
# -*- encoding: UTF-8 -*-
# Get an image from NAO. Display it and save it using PIL.
import cv2
import os #new
import sys
import time
import numpy as np
from PIL import Image
from naoqi import ALProxy
from PIL import ImageFont
from PIL import ImageDraw
#---------------------------------------------------------------------------
def showNaoImage(text):
"""
First get an image from Nao, then show it on the screen with PIL.
"""
IP = "192.168.1.18" # Replace here with your NaoQi's IP address.
PORT = 9559
# Read IP address from first argument if any.
#if len(sys.argv) > 1:
#IP = sys.argv[1]
camProxy = ALProxy("ALVideoDevice", IP, PORT)
resolution = 2 # VGA
colorSpace = 11 # RGB
videoClient = camProxy.subscribe("python_client", resolution, colorSpace, 5)
#t0 = time.time()
# Get a camera image.
# image[6] contains the image data passed as an array of ASCII chars.
naoImage = camProxy.getImageRemote(videoClient)
# Time the image transfer.
#print "acquisition delay ", t1 - t0
camProxy.unsubscribe(videoClient)
# Now we work with the image returned and save it as a PNG using ImageDraw
# package.
# Get the image size and pixel array.
imageWidth = naoImage[0]
imageHeight = naoImage[1]
array = naoImage[6]
# Create a PIL Image from our pixel array.
im = Image.frombytes("RGB", (imageWidth, imageHeight), array)
frame=np.array(im)
#cv2.imshow("Faces found", frame)
#cv2.waitKey(0)
return frame
所以,我的问题是如何在cv::imshow("Original_image",presult);
中使用returnfram? 。在否则如何将pyobject转换为Mat?
非常感谢。
答案 0 :(得分:0)
由于showNaoImage
返回一个numpy数组,你可以使用numpy的C API从帧中提取值,或者获取指向包含值的内存的指针。请参阅the documentation,特别是涉及array data access的部分。
要将数据转换为Mat
接受的cv::imshow
数组,请使用Mat
构造函数及其数据及其尺寸。例如:
// numpy array created from a PIL image is 3-dimensional:
// height x width x num_channels (num_channels being 3 for RGB)
assert (PyArray_NDIM(presult) == 3 && PyArray_SHAPE(presult)[2] == 3);
// Extract the metainformation and the data.
int rows = PyArray_SHAPE(presult)[0];
int cols = PyArray_SHAPE(presult)[1];
void *frame_data = PyArray_DATA(presult);
// Construct the Mat object and use it.
Mat cv_frame(rows, cols, CV_8UC3, frame_data);
cv::imshow("Original_image", cv_frame);
答案 1 :(得分:0)
如果我没记错的话,opencv中应该有一个特定的函数可用于python,名为 pyopencv_to(pyobject,cv :: mat,...),它也可以进入帐户并可以处理灰色和彩色图像。
答案 2 :(得分:0)
Python 3.x C-API :
在Python端以frame
格式返回bytearray
:
return bytearray(frame)
并在cpp方面通过PyByteArray_AsString
函数获取它:
pData = PyObject_CallObject(pFunc, pArgs);
uchar *data = (uchar *)PyByteArray_AsString(pData );
cv::Mat img(rows, cols, CV_8UC3, data)