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