Python 无法计算cv.mat.步骤[0]的Numpy等效值

Python 无法计算cv.mat.步骤[0]的Numpy等效值,python,objective-c,macos,opencv,numpy,Python,Objective C,Macos,Opencv,Numpy,我目前正在用Python(使用PyObjC和Quartz模块)将代码从一个旧的OpenCV示例转换为OpenCV3。Objective-C代码获取UIImage并创建OpenCV可以使用的材质。我的python代码采用CGImage并执行相同的操作 以下是Objective-C代码: (cv::Mat)cvMatFromUIImage:(UIImage *)image { CGColorSpaceRef colorSpace = CGImageGetColorSpace(image.CGIm

我目前正在用Python(使用PyObjC和Quartz模块)将代码从一个旧的OpenCV示例转换为OpenCV3。Objective-C代码获取UIImage并创建OpenCV可以使用的材质。我的python代码采用CGImage并执行相同的操作

以下是Objective-C代码:

(cv::Mat)cvMatFromUIImage:(UIImage *)image {
  CGColorSpaceRef colorSpace = CGImageGetColorSpace(image.CGImage);
  CGFloat cols = image.size.width;
  CGFloat rows = image.size.height;

  cv::Mat cvMat(rows, cols, CV_8UC4); // 8 bits per component, 4 channels (color channels + alpha)

  CGContextRef contextRef = CGBitmapContextCreate(cvMat.data,                 // Pointer to  data
                                                 cols,                       // Width of bitmap
                                                 rows,                       // Height of bitmap
                                                 8,                          // Bits per component
                                                 cvMat.step[0],              // Bytes per row
                                                 colorSpace,                 // Colorspace
                                                 kCGImageAlphaNoneSkipLast |
                                                 kCGBitmapByteOrderDefault); // Bitmap info flags

  CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), image.CGImage);
  CGContextRelease(contextRef);

  return cvMat;
}
以下是我的Python等价物:

def macToOpenCV(image):
    color_space = CGImageGetColorSpace(image)
    column = CGImageGetHeight(image)
    row = CGImageGetWidth(image)
    mat = np.ndarray(shape=(row, column, 4), dtype=np.uint8)
    c_ref = CGBitmapContextCreate(mat,
                                  row,
                                  column,
                                  8,
                                  ,  # mat.step[0],
                                  color_space,
                                  kCGImageAlphaNoneSkipLast |
                                  kCGBitmapByteOrderDefault)

    CGContextDrawImage(c_ref, CGRectMake(0, 0, column, row), image)
    return mat
我很有信心,目前我已经掌握了大部分这方面的权利,但我已经失去了在Numpy中与cvMat.step[0]等效的东西。我还欢迎对代码段进行一些常规的代码检查,因为当我使用cv2.imshow()时,我根本没有得到我所期望的图像:)


谢谢

我最终放弃了上述方法,并在稍加编辑后找到了关于堆栈溢出问题的答案:


本例中的Image是PIL.Image。您还可以看到,我选择了自动步幅计算(frombuffer()中的参数0),这主要是因为我无法使用答案所使用的函数

来自缓冲区的是可以的,但是宽度不是64倍的图片将被拧紧。看见我使用nps frombuffer和as_跨步跳过了死像素,这是一种有效的方法:

cg\u img=cg.CGWindowListCreateImage(
CG.CGRectNull,
CG.KCGWindowListoption包括Windows,
wnd_id,
CG.kCGWindowImageBoundsIgnoreFraming | CG.kCGWindowImageNominalResolution
)
bpr=CG.CGImageGetBytesPerRow(CG_img)
宽度=CG.CGImageGetWidth(CG\U img)
高度=CG.CGImageGetHeight(CG\U img)
cg\u dataprovider=cg.CGImageGetDataProvider(cg\u img)
cg_数据=cg.CGDataProviderCopyData(cg_数据提供者)
np_原始数据=np.frombuffer(cg_数据,数据类型=np.uint8)
np_data=np.lib.stride_tricks.as_stride(np_原始数据,
形状=(高度、宽度、3),
步幅=(bpr,4,1),
可写=错误)
image_ref = CGWindowListCreateImage(CGRectNull,
                                        kCGWindowListOptionIncludingWindow,
                                        wid,
                                        kCGWindowImageBoundsIgnoreFraming)

pixeldata = CGDataProviderCopyData(CGImageGetDataProvider(image_ref))

height = CGImageGetHeight(image_ref)
width = CGImageGetWidth(image_ref)

image = Image.frombuffer("RGBA", (width, height),
                         pixeldata, "raw", "RGBA", 0, 1)

# Color correction from BGRA to RGBA
b, g, r, a = image.split()
image = Image.merge("RGBA", (r, g, b, a))
np.array(image)
return np.array(image)