bounty还有4天到期。回答此问题可获得+300声望奖励。Oded Harth希望引起更多关注这个问题。
我有一个iOS应用程序,可以使用OpenCV分析摄像头的视频。
正在显示的视频位于BGR中。
从Xcode 13升级到14后,视频已停止显示,这已出现在日志中:
CGImageCreate: invalid image byte order info for bitsPerPixel != 32 = 16384
调试后,似乎当我将帧从BGR更改为Gray和RGBA时,它可以工作:
cvtColor( frame, frame, COLOR_BGR2GRAY ); // works
cvtColor( frame, frame, COLOR_BGR2RGBA ); // works
但我不想把视频变成灰色,RGBA视频看起来不对。
当我尝试在RGB中显示时,它崩溃了:
cvtColor( frame, frame, COLOR_BGR2RGB ); // didn't work
有什么问题吗?有什么可以解决的?
2条答案
按热度按时间mfuanj7w1#
我对Xcode 14了解不多,但是当你使用
cvtColor
函数改变颜色空间时,它会改变图像中通道的数量。BGR颜色空间有3个通道(蓝色、绿色和红色),而Gray只有1个通道,RGBA有4个通道(红色、绿色、蓝色和alpha)。在当前情况下,将颜色空间更改为Gray或RGBA有效,因为这些颜色空间的字节顺序与
CGImageCreate
兼容。但是,当您尝试将颜色空间更改为RGB时,字节顺序会变得不兼容,从而导致崩溃。一些解决方案(仅限个人意见):
1.要在显示图像之前使用
cv::flip
更改图像的字节顺序,请执行以下操作:这将垂直翻转图像的行,有效地将字节顺序更改为
CGImageCreate
的兼容格式。1.将
cv::cvtColor
与COLOR_BGR2BGRA
一起使用,而不是COLOR_BGR2RGBA
。这将在保留原始字节顺序的同时向BGR镜像添加alpha通道:我希望这有帮助!!
fiei3ece2#
它崩溃是因为字节顺序与预期的格式不兼容。手动重新排列BGR图像中每个像素的蓝色和红色通道。
可能的解决方案:
1-将BGR图像转换为BGRA,然后重新排列通道以匹配RGB顺序。fromTo数组指定从BGR到RGB的通道重排。
2-拆分BGR通道,交换蓝色和红色通道,然后合并它们以创建RGB图像。只要原始图像确实在BGR颜色空间中,这种方法就应该起作用。通过手动交换通道,可以绕过与字节顺序信息相关的任何潜在问题。