Я написал функцию, которая эффективно перебирает пиксели изображения оттенки серого с помощью C++. Ключ заключается в использовании указателей на строки / столбцы изображений вместо обычного доступа к пикселям.
Логика C++ выглядит так:
Mat image = imread(image_path); //path for the image
for (int j = 0; j < rawDepth.rows; j++)
{
const ushort* Mi = rawDepth.ptr<ushort>(j); //pointer to the current column
for (int i = 0; i < rawDepth.cols; i++)
{
ushort pixelValue = Mi[i]; //value of the pixel
}
}
Этот метод очень быстрый, но мне нужно, чтобы он работал на Python. Мне удалось успешно переписать его с помощью Cython, но теперь я застрял с проблемой получения указателей на столбцы в массивах numpy nd.
Мое изображение хранится в массиве 2D numpy (я читал его с помощью cv2)
Я пытался эффективно преобразовать свое изображение из массива np в структуру, аналогичную объекту C++ Mat, что дало бы мне такую же эффективность.
Я пробовал несколько подходов, которые нашел в Интернете, но ни один из них, похоже, не работает. Я использую Python 3.6.6 и Cython 0.28.5
Спасибо
Обновлено: мне удалось реализовать решение, описанное здесь. Теперь у меня есть файл cpp, в котором я могу вызвать функцию nparrayToMat () из моего файла pyx.
Однако я не могу получить доступ к функции .ptr Mat.
Буду признателен, если кто-нибудь укажет, как это сделать.
Используйте cv2.imread() в Python, и вы можете получить доступ к изображению, которое вы читаете, напрямую как массив Numpy. См. stackoverflow.com/a/52079022/2836621
@MarkSetchell, да, я уже этим занимаюсь. У меня есть изображение в виде массива Numpy, но оно мне нужно как объект Mat, поэтому я могу использовать указатели на столбцы.






См. Источники OpenCV, эффективное преобразование между массивом numpy и C++ Mat - это то, что он постоянно делает в оболочках Python.