Skip to content

Commit 144865b

Browse files
committed
try another one
1 parent 2e95188 commit 144865b

File tree

1 file changed

+79
-55
lines changed

1 file changed

+79
-55
lines changed

.github/workflows/test-opencvsharp.yml

Lines changed: 79 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -40,72 +40,96 @@ jobs:
4040
4141
- name: Create test.c
4242
run: |
43-
mkdir test && cd test
44-
cat > test.c << 'EOF'
43+
mkdir -p test
44+
cat > test/test.c <<'EOF'
4545
#include <stdio.h>
4646
#include <stdint.h>
47-
48-
/* ========== OpenCvSharpExtern exported C prototypes ========== */
49-
typedef struct Mat Mat;
50-
typedef struct { double val[4]; } Scalar;
51-
typedef struct { int x; int y; } Point;
52-
47+
#include <assert.h>
48+
49+
/* ==== 简易类型 / 宏定义 ==== */
50+
typedef long long uint64; /* 对应 C# 的 UInt64 */
51+
typedef int ExceptionStatus; /* OpenCvSharpExtern 约定:0 = OK */
52+
typedef struct { double val[4]; } MyCvScalar;
53+
typedef struct cv_Mat cv_Mat; /* 不需要知道内部实现 */
54+
55+
/* OpenCV 常量(直接抄一份足够用即可) */
56+
#define CV_8UC3 16 /* 8-bit unsigned, 3 channels */
57+
#define IMWRITE_JPEG_QUALITY 1
58+
59+
/* ==== C API 声明 ==== */
5360
/* core */
54-
int core_Mat_sizeof(void);
55-
Mat* core_Mat_new2(int rows, int cols, int type);
56-
void core_Mat_delete(Mat* mat);
57-
uint8_t* core_Mat_data(Mat* mat);
58-
int core_Mat_rows(Mat* mat);
59-
int core_Mat_cols(Mat* mat);
60-
int core_Mat_type(Mat* mat);
61-
61+
extern uint64 core_Mat_sizeof(void);
62+
extern ExceptionStatus core_Mat_new3(int rows,int cols,int type,
63+
MyCvScalar scalar, cv_Mat **returnValue);
64+
extern ExceptionStatus core_Mat_delete(cv_Mat *self);
6265
/* imgcodecs */
63-
int imgcodecs_imwrite(const char* fileName, Mat* mat,
64-
const int* params, int paramsLength);
65-
66-
/* ========== Convenience macro (same数值和 OpenCV 保持一致) ========== */
67-
#define CV_8U 0
68-
#define CV_CN_SHIFT 3
69-
#define CV_MAKETYPE(depth, cn) ( (depth) + ( (cn - 1) << CV_CN_SHIFT ) )
70-
#define CV_8UC3 CV_MAKETYPE(CV_8U,3)
71-
66+
extern ExceptionStatus imgcodecs_imwrite(const char *filename, cv_Mat *img,
67+
int *params,int paramsLength,int *returnValue);
68+
extern ExceptionStatus imgcodecs_imread (const char *filename,int flags,
69+
cv_Mat **returnValue);
70+
71+
/* ==== 帮助函数:检查返回值 ==== */
72+
static void CHECK_OK(ExceptionStatus st, const char *msg)
73+
{
74+
if(st != 0) { fprintf(stderr,"%s failed: %d\n", msg, st); exit(st); }
75+
}
76+
static void CHECK_BOOL(int ok, const char *msg)
77+
{
78+
if(!ok) { fprintf(stderr,"%s returned false\n", msg); exit(1); }
79+
}
80+
7281
int main(void)
7382
{
74-
printf("sizeof(cv::Mat) reported by core_Mat_sizeof = %d bytes\n",
75-
core_Mat_sizeof());
76-
77-
/* 1. 创建 100×100×3 uchar 图像 */
78-
Mat* img = core_Mat_new2(100, 100, CV_8UC3);
79-
if (!img) {
80-
fprintf(stderr, "core_Mat_new2 failed\n");
81-
return 1;
82-
}
83-
84-
/* 2. 填充像素:让 B=行, G=列, R=(行+列)/2 */
85-
uint8_t* data = core_Mat_data(img);
86-
int rows = core_Mat_rows(img);
87-
int cols = core_Mat_cols(img);
88-
for (int r = 0; r < rows; ++r) {
89-
for (int c = 0; c < cols; ++c) {
90-
int idx = (r * cols + c) * 3;
91-
data[idx + 0] = (uint8_t)r; /* B */
92-
data[idx + 1] = (uint8_t)c; /* G */
93-
data[idx + 2] = (uint8_t)((r + c) >> 1); /* R */
83+
printf("sizeof(Mat) reported by native = %llu\n",
84+
(unsigned long long)core_Mat_sizeof());
85+
86+
/* 1. 先创建一张 256×256、彩色渐变图像 ----------------------------- */
87+
cv_Mat *img = NULL;
88+
MyCvScalar black = {0};
89+
CHECK_OK(core_Mat_new3(256, 256, CV_8UC3, black, &img), "core_Mat_new3");
90+
91+
/* 通过指针手动绘制一个 BGR 渐变:B = x, G = y, R = 128 */
92+
unsigned char *data = NULL;
93+
extern ExceptionStatus core_Mat_data(cv_Mat *self, unsigned char **returnValue);
94+
CHECK_OK(core_Mat_data(img, &data), "core_Mat_data");
95+
for(int y = 0; y < 256; ++y)
96+
{
97+
for(int x = 0; x < 256; ++x)
98+
{
99+
unsigned char *pix = data + (y*256 + x)*3;
100+
pix[0] = (unsigned char)x; /* Blue 渐变 */
101+
pix[1] = (unsigned char)y; /* Green 渐变 */
102+
pix[2] = 128; /* Red 固定 */
94103
}
95104
}
96-
97-
/* 3. 写入 PNG 文件 */
98-
const char* outName = "test-output.png";
99-
int ok = imgcodecs_imwrite(outName, img, NULL, 0);
100-
printf("imgcodecs_imwrite(\"%s\") returned %d\n", outName, ok);
101-
102-
/* 4. 清理 */
105+
106+
/* 2. 保存为 PNG -------------------------------------------------- */
107+
int ok = 0;
108+
CHECK_OK(imgcodecs_imwrite("test.png", img, NULL, 0, &ok), "imwrite PNG");
109+
CHECK_BOOL(ok, "imwrite PNG");
110+
111+
/* 3. 读取刚写出的 PNG ------------------------------------------- */
112+
cv_Mat *img2 = NULL;
113+
CHECK_OK(imgcodecs_imread("test.png", /*flags=*/1, &img2), "imread PNG");
114+
/* 不需要检查 NULL,因为 C API 出错会抛异常,已在上一步捕获 */
115+
116+
/* 4. 以 JPEG 质量 90 再保存为 JPG -------------------------------- */
117+
int jpegParams[2] = { IMWRITE_JPEG_QUALITY, 90 };
118+
CHECK_OK(imgcodecs_imwrite("test.jpg", img2,
119+
jpegParams, 2, &ok), "imwrite JPG");
120+
CHECK_BOOL(ok, "imwrite JPG");
121+
122+
printf("PNG and JPG written successfully.\n");
123+
124+
/* 5. 释放资源 ---------------------------------------------------- */
103125
core_Mat_delete(img);
104-
return ok ? 0 : 1;
126+
core_Mat_delete(img2);
127+
128+
return 0;
105129
}
106130
EOF
107-
cat test.c
108-
131+
cat test/test.c
132+
109133
- name: Setup MSVC(Windows only)
110134
uses: ilammy/msvc-dev-cmd@v1
111135
if: startsWith(matrix.os, 'win')

0 commit comments

Comments
 (0)