Недавно я начал использовать Приоритеты производительности Intel (IPP) для обработки изображений. Для тех, кто не слышал об IPP, подумайте о IPP как аналоге MKL для обработки изображений вместо линейной алгебры.
Я уже реализовал несколько сложную систему видения в OpenCV, и я хотел бы поменять некоторые из подпрограмм OpenCV (например, свертки и FFT) для более быстрых подпрограмм IPP. Мой код OpenCV всегда использует структуру данных изображения cv::Mat
. Однако, основываясь на образцах кода IPP, кажется, что IPP предпочитает структуру данных CIppiImage
.
Моя система выполняет несколько преобразований изображений в OpenCV, затем я хочу сделать несколько вещей в IPP, а затем больше работать в OpenCV. Здесь наивный способ заставить OpenCV и IPP хорошо сочетаться друг с другом:
cv::Mat = load original image
use OpenCV to do some work on cv::Mat
write cv::Mat to file
CIppiImage = read cv::Mat from file //for IPP
use IPP to do some work on CIppiImage
write CIppiImage to file
cv::Mat = read CIppiImage from file
use OpenCV to do more work on cv::Mat
write final image to file
Однако это довольно утомительно, и файлы для чтения/записи, вероятно, добавляют к общему времени выполнения.
Я пытаюсь сделать его более плавным, чтобы чередовать OpenCV и IPP в программе обработки изображений. Вот несколько вещей, которые могли бы решить проблему:
- Есть ли однострочный конвертер, который преобразует
cv::Mat
вCIppiImage
и наоборот? - Я хорошо знаком с деталями реализации
cv::Mat
, но я мало что знаю оCIppiImage
. Уcv::Mat
иCIppiImage
есть один и тот же макет данных? Если да, могу ли я сделать что-то похожее на следующий листинг?CIppiImage cimg = (CIppiImage)(&myMat.data[0])
?