gpt4 book ai didi

python - 为什么我的 PyArrayObject* 数据​​被截断?

转载 作者:行者123 更新时间:2023-11-30 18:50:48 26 4
gpt4 key购买 nike

为什么我的 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 计数到数据中的第一个 0(它是为空终止的文本字符串设计的)。另外,如果它遇到的第一个 0 是在您的数据完成之后,那么它将返回一个太大的数字,这意味着您可能会尝试写入不属于您的数据。

要计算出 pyarrayobject 的大小,您需要使用 arr->nd 来计算维数,然后使用 arr->dimensions (数组)来计算计算出每个维度有多大。您还应该使用 arr->descr 来确定数组的数据类型,而不仅仅是将其测试为 char。

关于python - 为什么我的 PyArrayObject* 数据​​被截断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39020916/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com