Python 调用C++ 的图像传递

import ctypes as C
from ctypes import Structure
import cv2
import numpy as np

class ImgData(Structure):
    _fields_ = [("available", C.c_bool),
                ("rows", C.c_int),
                ("cols", C.c_int),
                ("channels", C.c_int),
                ("data",C.POINTER(C.c_ubyte))]

dll = C.cdll.LoadLibrary("G:/AnacondaProgram3/daydayup/DLL/OpenCVTest.dll")

testVoidP = dll.RestVoid
testVoidP.restype = C.c_void_p

testCall = dll.SmBusReadByte
testCall.argtypes = [C.c_void_p]
testCall.restype = C.c_int

tempHandle = testVoidP()
r111 = testCall(tempHandle)

#ndarray_image = dll.ndarray_to_image
#ndarray_image.argtypes = [C.POINTER(C.c_ubyte),C.ARRAY(C.c_longlong,3), C.ARRAY(C.c_longlong,3)]
#ndarray_image.restype = IMAGE

testArrayCall = dll.TestStructArray
testArrayCall.argtypes = [C.POINTER(C.POINTER(ImgData)), C.POINTER(C.POINTER(ImgData))]
testArrayCall.restype = C.c_int
#resTempTest11 = C.POINTER(ImgData)()
resTempTest11 = ImgData()
resTempTest11.available = True
resTempTest11.rows = 369
resTempTest11.cols = 852
resTempTest11.channels = 147
tempP = C.pointer(resTempTest11)
outTempTest = C.POINTER(ImgData)()
resInt11 = testArrayCall(C.byref(tempP), C.byref(outTempTest))

imgDataArr = C.cast(outTempTest, C.POINTER(ImgData))
print(imgDataArr[0].channels)




img = cv2.imread('./images/OIP-C.jpg')

(rows, cols) = (img.shape[0], img.shape[1])

ret_img = np.zeros(dtype=np.uint8, shape=(rows, cols, 3))
dll.draw_circle(rows, cols, img.ctypes.data_as(C.POINTER(C.c_ubyte)), ret_img.ctypes.data_as(C.POINTER(C.c_ubyte)))

cv2.imshow("src with circle",ret_img)
cv2.waitKey(0)
#pragma once
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <cstdlib>
#include <io.h>

#define DLLEXPORT extern "C" _declspec(dllexport) 

using namespace std;
struct ImgData
{
    bool available;
    int rows;
    int cols;
    int channels;
    unsigned char* data;
};


void writeTxt(string contextVal, string filePath = "./dataFile.txt")
{
    ofstream dataFile;
    dataFile.open(filePath, ofstream::app);
    fstream file("dataFile.txt", ios::out);


    dataFile << contextVal << endl;     // 写入数据
    dataFile.close();                   // 关闭文档
}


DLLEXPORT void draw_circle(int rows, int cols, unsigned char* src_data, unsigned char* ret_data);

void draw_circle(int rows, int cols, unsigned char* src_data, unsigned char* ret_data)
{
    //将unsigned char转换成Mat
    cv::Mat src = cv::Mat(rows, cols, CV_8UC3, src_data);
    //在图像上画一个蓝色的圆
    cv::circle(src, cv::Point(60, 60), 10, cv::Scalar(255, 0, 0));
    //将Mat转换成unsigned char
    memcpy(ret_data, src.data, rows * cols * 3);
}
ImgData make_image_uc(int w, int h, int c)
{
    ImgData out;
    out.available = true;
    out.cols = w;
    out.rows = h;
    out.channels = c;
    out.data = (unsigned char*)calloc(h * w * c, sizeof(unsigned char));
    return out;
}

DLLEXPORT ImgData CreateImage(int rows, int cols, unsigned char* src_data);
ImgData CreateImage(int rows, int cols, unsigned char* src_data)
{
    //将unsigned char转换成Mat
    cv::Mat src = cv::Mat(rows, cols, CV_8UC3, src_data);
    //在图像上画一个蓝色的圆
    cv::circle(src, cv::Point(60, 60), 10, cv::Scalar(255, 0, 0));

    ImgData resImg = make_image_uc(src.rows, src.cols, src.channels());
    //将Mat转换成unsigned char
    memcpy(resImg.data, src.data, rows * cols * 3);

    return resImg;
};

DLLEXPORT ImgData CreateImage2(ImgData* src_data);
ImgData CreateImage2(ImgData* src_data)
{
    //将unsigned char转换成Mat
    cv::Mat src = cv::Mat(src_data->rows, src_data->cols, CV_8UC3, src_data->data);
    //在图像上画一个蓝色的圆
    cv::circle(src, cv::Point(60, 60), 20, cv::Scalar(255, 0, 0));

    ImgData resImg = make_image_uc(src.rows, src.cols, src.channels());
    //将Mat转换成unsigned char
    memcpy(resImg.data, src.data, src_data->rows * src_data->cols * src_data->channels);

    return resImg;
};

DLLEXPORT void* RestVoid();
void* RestVoid()
{
    return (void*)0x12345678;
}

DLLEXPORT int SmBusReadByte(void* handle);
int SmBusReadByte(void * handle)
{
    writeTxt("OK");
    return int(handle);
}

DLLEXPORT int TestStructArray(ImgData** handle, ImgData** outImage);
int TestStructArray(ImgData** handle, ImgData** outImage)
{
    std::cout<<(*handle)->available<<endl;
    //writeTxt("call TestStructArray");
    printf("call TestStructArray");
    ImgData* TempOutImage;
    TempOutImage = reinterpret_cast<ImgData*>(malloc(sizeof(ImgData) * 2));
    memset(TempOutImage, 0, sizeof(ImgData) * 2);
    TempOutImage[0].available = true;
    TempOutImage[0].cols = 111;
    TempOutImage[0].rows = 222;
    TempOutImage[0].channels = (*handle)->channels;
    *outImage = TempOutImage;
    return 1;
}

C:\opencv_4_6\build\x64\vc15\bin

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丈八涯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值