Я играю с этими привязками OpenCV для Racket , и я хотел бы иметь возможность доступа к значениям пикселей в виде массива, в основном, чтобы я мог использовать индексирование столбцов строк. В примерах только показано, как вызывать высокоуровневые функции OpenCV, а затем доступ к необработанным данным отображается только при низкоуровневом доступе к bytestring .
. Все это прекрасно работает, я был довольно впечатлен. Думаю, что для некоторых приложений мы должны быть в состоянии выполнять попиксельную обработку, в идеале используя любой объект многомерного массива в Racket, который выглядит как math:array
. Вопрос в том, как создать этот изменяемый массив из объекта IplImage
.
Мне удалось запустить пример bytestring, который уже не идеален, поскольку он не поддерживает другие типы, такие как float. Следующий фрагмент кода работает, создавая cvector
из указателя на данные изображения:
(define xx (make-cvector* (IplImage-imageData frame) ffi:_uint8 307200))
(cvector-set! xx ii 255)
(set! ii (ii . + . 1) )
Это рисует пиксель, движущийся в каждом кадре внутри al oop ... Это работает. Теперь я хотел бы создать массив из этого cvector
. Я придумал следующий код:
(define (image->array image)
(let ([data
(make-cvector* (IplImage-imageData image)
ffi:_uint8
(IplImage-imageSize image))]
[shape (vector (IplImage-height image) (IplImage-width image))])
(array->mutable-array (list->array
shape
(cvector->list data)))))
Это, очевидно, работает для чтения, но не для обратной записи. Как мне сделать его на самом деле изменчивым? И есть ли здесь проблемы с производительностью? Возможно ли cvector->list
скопировать все данные в новый список Racket? Как создать векторный объект Racket, который может использоваться math:array
?