Я новичок в openCV. Я редактирую изображение, и мне нужно читать и писать непрерывные пиксели на больших прямоугольных участках изображения, но не на всем изображении. Мои входные изображения имеют одноканальную серую шкалу, с CV_16UC1 в качестве входа и CV_8UC1 в качестве вывода. В настоящее время я обращаюсь к пикселям с помощью MatConstIterator _.
Mat image, image_read = imread(infilename, 0);
image_read.convertTo(image, CV_16UC1);
//...define img_dim_y, img_dim_x
Mat imout(img_dim_y, img_dim_x, CV_8UC1);
MatConstIterator_<uint16_t> pin = imageIn.begin<uint16_t>(), pixel_in_end = imageIn.end<uint16_t>();
MatIterator_<uint8_t> pixel_out = imageOut.begin<uint8_t>();
for(; /*selected pixel in a patch*/; ++pixel_out , ++pixel_out)
*pixel_out = My_transform(*pixel_in);
Это ограниченная пропускная способность памяти, и она тратит все свое время на чтение и запись пикселей со скоростью 10 микросекунд на пиксель. Моя машина довольно современная, поэтому она намного медленнее, чем тактовые частоты ~ МГц. Для 64-битной машины должна быть возможность считывать сразу 4 16-битных пикселя и записывать 8 8-битных пикселов одновременно, используя несколько операций сдвига. Это ускорит конвейер как минимум в 4-5 раз. Как я могу получить эти данные от OpenCV Mat?