在python3.1上使用OpenCV的ctypes指针

2024-10-04 11:31:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试在python3.1上通过ctypes使用OpenCV,但是我不知道如何表示指针。例如,如果我想加载一个图像并打印她的第一个像素的内容,我将用C++编写:

#include <opencv/cv.h>
#include <opencv/highgui.h>

using namespace std;

int main() {
    IplImage *img;
    img = cvLoadImage("/home/foo/foo.png");
    CvScalar pixel = cvGet2D(img, 20, 30);
    printf(pixel)
    return 0
}

但是在Python中,在ctypes上,我必须表示IplImage、CvScalar结构等等,而且我必须使用“指针”来实现这一点,例如:IplImage *img;。在

但是怎么做呢?我试过了:

^{pr2}$

但是我没有CvScalar结构(我不知道如何表示它),我使用了错误的指针ctypes,我有一个“segfault”错误。在


Tags: 图像内容imgfooinclude错误像素ctypes
1条回答
网友
1楼 · 发布于 2024-10-04 11:31:58

在opencv2.3中,CvScalar结构是封装在结构中的double[4],问题中显示的其他结构定义明显不同。此外,^ {CD3}}具有一个在C++中具有默认值的^ {< CD4}}参数。当用ctypes调用时,必须将其设置为CV_LOAD_IMAGE_*常量之一。在

from ctypes import *

CV_LOAD_IMAGE_UNCHANGED = -1
CV_LOAD_IMAGE_GRAYSCALE = 0
CV_LOAD_IMAGE_COLOR = 1
CV_LOAD_IMAGE_ANYDEPTH = 2
CV_LOAD_IMAGE_ANYCOLOR = 4

CvArr = None

class CvScalar(Structure):
    _fields_ = [('val', c_double * 4)]  # e.g BGRA, see channelSeq

class IplRoi(Structure):
    _fields_ = [
      ('coi', c_int),
      ('xOffset', c_int),
      ('yOffset', c_int),
      ('width', c_int),
      ('height', c_int),
    ]

class IplImage(Structure): pass
IplImage._fields_ = [
      ('nSize', c_int),
      ('ID', c_int),
      ('nChannels', c_int),
      ('alphaChannel', c_int),
      ('depth', c_int),
      ('colorModel', c_char * 4),
      ('channelSeq', c_char * 4),
      ('dataOrder', c_int),
      ('origin', c_int),
      ('align', c_int),
      ('width', c_int),
      ('height', c_int),
      ('roi', POINTER(IplRoi)),
      ('maskROI', POINTER(IplImage)),
      ('imageId', c_void_p),
      ('tileInfo', c_void_p),
      ('imageSize', c_int),
      ('imageData', POINTER(c_char)),
      ('widthStep', c_int),
      ('BorderMode', c_int * 4),
      ('BorderConst', c_int * 4),
      ('imageDataOrigin', POINTER(c_char)),
    ]

为了测试,我使用了Debian repository中的2.3 OpenCV libs和以下4通道PNG:

rgba8_trans.png

^{pr2}$

输出:

width = 85, height = 62

y=30, x=30
('B', 128.0) ('G', 128.0) ('R', 64.0) ('A', 176.0)

相关问题 更多 >