You need to enable JavaScript to run this app. 将OpenCV读取的图像传递给C++ DLL函数后读取像素异常如何解决?
优惠活动
大模型
产品
解决方案
定价
更多

将OpenCV读取的图像传递给C++ DLL函数后读取像素异常如何解决?

问题根因

核心错误是C++侧函数的参数类型和Python传入的指针类型完全不匹配:

  1. Python侧OpenCV读取的灰度图是uint8类型的连续一维数组(内存中逐行连续存储),你传入的是指向第一个像素的一级指针
  2. C++侧的参数定义为int** a属于二级指针,相当于你把第一个像素的内存值当成了指针地址解析,自然会读到无意义的大数值,访问二级偏移地址时会直接触发越界访问错误。

修复步骤

1. 修改C++侧函数签名

把参数改为匹配的一级无符号字符指针,按二维坐标访问像素时手动计算行偏移即可:

// 参数a改为unsigned char*一级指针,对应Python传入的uint8数组首地址
unsigned int transform(unsigned char* a, int row, int col, int ang){
    // 读取第i行第j列像素的写法:a[i * col + j]
    for (int i = 0; i < 4; i++) {
        // 输出前4个像素值,可直接和Python侧real_img[i]的结果对比
        cout << static_cast<int>(a[i]) << endl;
    }
    // 示例:读取第3行第2个像素写为 a[2 * col + 1]
    // ... 其余业务逻辑
}

2. 修正Python侧代码

先修复代码中混用real_img/real_image/myimage的笔误,可显式声明DLL函数参数类型避免隐式转换出错:

import cv2
import ctypes
from ctypes import WinDLL

real_img = cv2.imread("215107.jpg", 0)
h, w = real_img.shape[0], real_img.shape[1]
angle = 90 # 替换为实际角度值
dll_path = "你的dll文件路径.dll" # 替换为实际DLL路径

hllDll = WinDLL(dll_path)
# 显式声明函数参数类型,避免ctypes自动推导出错
hllDll.transform.argtypes = [ctypes.POINTER(ctypes.c_uint8), ctypes.c_int, ctypes.c_int, ctypes.c_int]
hllDll.transform.restype = ctypes.c_uint

# 传指针调用
img_ptr = real_img.ctypes.data_as(ctypes.POINTER(ctypes.c_uint8))
hllDll.transform(img_ptr, ctypes.c_int(h), ctypes.c_int(w), ctypes.c_int(angle))

可选注意项

如果你的OpenCV图像做过裁剪、翻转等操作,内存可能不是连续的,传参前先转成连续内存:

if not real_img.flags.contiguous:
    real_img = real_img.copy()

内容的提问来源于stack exchange,提问作者Eraclea

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 10:15:06