Я нашел решение этой проблемы. Это была проблема шага строки: очевидно, в iOS 13 был изменен шаг строки 8-битного двухплоскостного буфера Yp Cb Cr 4: 2: 0. Возможно, для него всегда будет степень 2. Поэтому в некоторых случаях шаг строки больше не равен ширине. Это был случай для меня. Исправить это просто, просто получите шаг строки из информации буфера и передайте его конструктору OpenCV Mat, как показано ниже.
void *baseaddress = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 0);
size_t width = CVPixelBufferGetWidthOfPlane(pixelBuffer, 0);
size_t height = CVPixelBufferGetHeightOfPlane(pixelBuffer, 0);
size_t bytesPerRow = CVPixelBufferGetBytesPerRowOfPlane(pixelBuffer, 0);
cv::Mat frame(height, width, CV_8UC1, baseaddress, bytesPerRow);
Обратите внимание, что я также изменил способ получения ширины и высоты с помощьюразмеры плоскости вместо размеров буфера. Для плоскости Y она всегда должна быть одинаковой. Я не уверен, что это имеет значение.
Также будьте осторожны: после обновления Xcode для поддержки iOS 13 SDK мне пришлось удалить приложение с тестового устройства, потому что в противном случае Xcode продолжал использовать старую версиювместо недавно скомпилированного.