将kivy纹理转换为opencv图像



我正在尝试将kivy纹理转换为图像格式,以便使用opencv(cv2(进行处理。我试着用read((和cv2.imread(。我还考虑过将ubyte纹理转换为字符串,但没有成功。

kivy相机纹理->我可以使用cv2 处理的格式

类似的东西

MyVariable = someid.texture
#do something to format of MyVariable so that it is an 'image'
Newvar = MyVariable.read()
#cv2 processing...

编辑:

好的,所以我使用texture.pixel以RGB阵列格式从纹理中获得数据。然后我使用

newvalue = np.frombuffer(camera.texture.pixels, np.uint8) 

以将数据转换为numpy字符串。从那里可以很容易地使用在图像小部件上重新显示它

finalstage = newvalue.tostring()
texture1 = Texture.create(size=variables.size, colorfmt='rgba')
texture1.blit_buffer(finalstage, colorfmt='rgba', bufferfmt='ubyte')
image.texture = texture1

我的问题是,现在我想使用Opencv在人脸上绘制矩形,然后更新图像纹理。我有绘制矩形的工作代码,但我首先需要使用将RGB数据转换为灰色

gray = cv2.cvtColor(newvalue, cv2.COLOR_RGBA2GRAY)

这样做会返回我的新错误:

11-08 17:22:51.451 25259 25582 E cv::error(): OpenCV(4.0.1) Error: Unspecified error (> Invalid number of channels in input image:
11-08 17:22:51.451 25259 25582 E cv::error(): >     'VScn::contains(scn)'
11-08 17:22:51.451 25259 25582 E cv::error(): > where
11-08 17:22:51.451 25259 25582 E cv::error(): >     'scn' is 1
11-08 17:22:51.451 25259 25582 E cv::error(): ) in cv::CvtHelper<cv::Set<3, 4, -1>, cv::Set<1, -1, -1>, cv::Set<0, 2, 5>, cv::SizePolicy::NONE>::CvtHelper(cv::InputArray, cv::OutputArray, int) [VScn = cv::Set<3, 4, -1>, VDcn = cv::Set<1, -1, -1>, VDepth = cv::Set<0, 2, 5>, sizePolicy = cv::SizePolicy::NONE], file /home/.../color.hpp, line 259

如果我遗漏了什么,请告诉我

您必须重塑"newvalue">

height, width = camera.texture.height, camera.texture.width
newvalue = np.frombuffer(camera.texture.pixels, np.uint8)
newvalue = newvalue.reshape(height, width, 4)
gray = cv2.cvtColor(newvalue, cv2.COLOR_RGBA2GRAY)

最新更新