ios CGImageCreate:bitsPerPixel图像字节顺序信息无效!= 32 = 16384

z5btuh9x  于 2023-06-25  发布在  iOS
关注(0)|答案(2)|浏览(263)

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

有什么问题吗?有什么可以解决的?

mfuanj7w

mfuanj7w1#

我对Xcode 14了解不多,但是当你使用cvtColor函数改变颜色空间时,它会改变图像中通道的数量。BGR颜色空间有3个通道(蓝色、绿色和红色),而Gray只有1个通道,RGBA有4个通道(红色、绿色、蓝色和alpha)。
在当前情况下,将颜色空间更改为Gray或RGBA有效,因为这些颜色空间的字节顺序与CGImageCreate兼容。但是,当您尝试将颜色空间更改为RGB时,字节顺序会变得不兼容,从而导致崩溃。
一些解决方案(仅限个人意见):
1.要在显示图像之前使用cv::flip更改图像的字节顺序,请执行以下操作:

cvtColor(frame, frame, COLOR_BGR2RGB);
cv::flip(frame, frame, 0); // flip vertically
cv::imshow("Video", frame);

这将垂直翻转图像的行,有效地将字节顺序更改为CGImageCreate的兼容格式。
1.将cv::cvtColorCOLOR_BGR2BGRA一起使用,而不是COLOR_BGR2RGBA。这将在保留原始字节顺序的同时向BGR镜像添加alpha通道:

cvtColor(frame, frame, COLOR_BGR2BGRA);
cv::imshow("Video", frame);

我希望这有帮助!!

fiei3ece

fiei3ece2#

它崩溃是因为字节顺序与预期的格式不兼容。手动重新排列BGR图像中每个像素的蓝色和红色通道。
可能的解决方案:
1-将BGR图像转换为BGRA,然后重新排列通道以匹配RGB顺序。fromTo数组指定从BGR到RGB的通道重排。

cvtColor(frame, frame, COLOR_BGR2BGRA);

// Rearrange the color channels to match RGB order
cv::Mat frameRGB(frame.rows, frame.cols, CV_8UC3);
// Reorder channels from BGR to RGB
int fromTo[] = {0, 2, 1, 1, 2, 0};
mixChannels(&frame, 1, &frameRGB, 1, fromTo, 3);

2-拆分BGR通道,交换蓝色和红色通道,然后合并它们以创建RGB图像。只要原始图像确实在BGR颜色空间中,这种方法就应该起作用。通过手动交换通道,可以绕过与字节顺序信息相关的任何潜在问题。

// Split the BGR channels
std::vector<cv::Mat> bgrChannels(3);
cv::split(frame, bgrChannels);

// Swap the blue and red channels
cv::Mat rgbFrame;
std::vector<cv::Mat> rgbChannels = {bgrChannels[2], bgrChannels[1], bgrChannels[0]};
cv::merge(rgbChannels, rgbFrame);

相关问题