Python 无法计算cv.mat.步骤[0]的Numpy等效值
我目前正在用Python(使用PyObjC和Quartz模块)将代码从一个旧的OpenCV示例转换为OpenCV3。Objective-C代码获取UIImage并创建OpenCV可以使用的材质。我的python代码采用CGImage并执行相同的操作 以下是Objective-C代码: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
(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)