【发布时间】:2016-08-18 14:32:05
【问题描述】:
为什么我的 C 函数中的数组会被截断?
在 C 中:
#include <Python.h>
#include <arrayobject.h>
PyObject *edge(PyObject *self, PyObject *args) {
int *ptr;
unsigned char *charPtr;
PyArrayObject *arr;
PyObject *back;
int ctr = 0;
int size = 500 * 500;
if (!PyArg_ParseTuple(args, "O", &arr))
return NULL;
charPtr = (char*)arr->data;
printf("\n strlen of charPtr is ---> %d \n", strlen(arr->data)); // --->> 25313
printf("\n strlen of charPtr is ---> %d \n", strlen(charPtr)); //--->> also 25313
back = Py_BuildValue("s", "Nice");
return back;
}
在 Python 中:
import ImageProc
import cv2
import numpy
import matplotlib.pyplot as plt
img = cv2.imread("C:/Users/srlatch/Documents/Visual Studio 2015/Projects/PythonImage/andrew.jpg", cv2.IMREAD_GRAYSCALE)
np = cv2.resize(img, (500,500))
for i in np:
for k in i:
count += 1
print("Size before passing to edge " + str(count) ) // --->> 250000
result = ImageProc.edge(np)
cv2.imshow("image", np)
cv2.waitKey()
当我尝试使用不同大小的图像时,我得到了相同的结果(删除了 9/10 的数据)。
【问题讨论】:
-
你为什么打电话给
strlen?你不是在处理一个字符串。 -
我试图在 for 循环中更改这个数组,如果我超过 25313,它会崩溃,并且只有 1/10(大约)的图像是变化的。(我认为字符串只是连续的字节。 )
-
@Anatoly C 字符串是
\0终止的char数组。strlen和其他str*函数旨在处理此类数据。无法获取数组的大小(好吧,除非它是固定大小的数组,在这种情况下,您可以使用其类型中的sizeof)。您必须明确跟踪其大小。如答案所示,numpy 数组是 multidimensional 数组,因此它们会跟踪每个维度的大小,您必须处理它。 -
现在我明白了,谢谢!