我想寫一個更好的版本的cv :: resize()的OpenCV,我來了一個十字架的代碼是在這裏:https://github.com/rmaz/NEON-Image-Downscaling/blob/master/ImageResize/BDPViewController.m 該代碼是下采樣圖像2但我無法獲得算法。我想首先將該算法轉換爲C,然後嘗試將其修改爲用於學習目的。將它轉換爲任意大小的下采樣也很容易嗎?解釋ARM霓虹燈圖像採樣
功能是:
static void inline resizeRow(uint32_t *dst, uint32_t *src, uint32_t pixelsPerRow)
{
const uint32_t * rowB = src + pixelsPerRow;
// force the number of pixels per row to a multiple of 8
pixelsPerRow = 8 * (pixelsPerRow/8);
__asm__ volatile("Lresizeloop: \n" // start loop
"vld1.32 {d0-d3}, [%1]! \n" // load 8 pixels from the top row
"vld1.32 {d4-d7}, [%2]! \n" // load 8 pixels from the bottom row
"vhadd.u8 q0, q0, q2 \n" // average the pixels vertically
"vhadd.u8 q1, q1, q3 \n"
"vtrn.32 q0, q2 \n" // transpose to put the horizontally adjacent pixels in different registers
"vtrn.32 q1, q3 \n"
"vhadd.u8 q0, q0, q2 \n" // average the pixels horizontally
"vhadd.u8 q1, q1, q3 \n"
"vtrn.32 d0, d1 \n" // fill the registers with pixels
"vtrn.32 d2, d3 \n"
"vswp d1, d2 \n"
"vst1.64 {d0-d1}, [%0]! \n" // store the result
"subs %3, %3, #8 \n" // subtract 8 from the pixel count
"bne Lresizeloop \n" // repeat until the row is complete
: "=r"(dst), "=r"(src), "=r"(rowB), "=r"(pixelsPerRow)
: "0"(dst), "1"(src), "2"(rowB), "3"(pixelsPerRow)
: "q0", "q1", "q2", "q3", "cc"
);
}
To call it:
// downscale the image in place
for (size_t rowIndex = 0; rowIndex < height; rowIndex+=2)
{
void *sourceRow = (uint8_t *)buffer + rowIndex * bytesPerRow;
void *destRow = (uint8_t *)buffer + (rowIndex/2) * bytesPerRow;
resizeRow(destRow, sourceRow, width);
}
你發現了一個很不好的例子:1)它與每個半添加截斷,因此結果不太準確。 2)除了令人困惑之外,它正在浪費所有這些轉換的寶貴週期。使用VPADD和VPADAL而不是半加,函數將快很多(轉置消失)並且更準確。 (只截取一次) – 2013-06-23 05:35:23