我的C ++程序遇到了瓶颈。有剪切rgb32图像的功能。看一下代码:
BOOL Convert2MultiImage(BYTE *p32Img, BYTE** p24Img, int dxSize32, int dySize32, int row, int vertical)
{
BYTE *pTemp;
BYTE** ptr = new BYTE*[row * vertical];
pTemp = p32Img;
for (int num = 0; num < row * vertical; num++)
{
ptr[num] = p24Img[num];
}
int displayWidth = dxSize32 * vertical;
int width4 = displayWidth * 4;
int width4_y = displayWidth * dySize32 * 4;
int x_4 = dxSize32 * 4;
int p = 0;
int seq = 0;
int i, j;
for (int r = 0; r < row; r++)
{
for (int v = 0; v < vertical; v++)
{
for (j = 0; j < dySize32; j++)
{
for (i = 0; i < dxSize32; i++)
{
p = (displayWidth * j + i + r * displayWidth * dySize32 + v * dxSize32) * 4;
*(ptr[seq]++) = pTemp[p];
*(ptr[seq]++) = pTemp[p + 1];
*(ptr[seq]++) = pTemp[p + 2];
}
}
seq++;
}
}
delete[] ptr;
ptr = NULL;
return true;
}
参数dxSize32 = 1920,dySize32 = 1080,row = 4,vertical = 4;该功能意味着可以将8K图像切成16个1080P图像。
此代码大约需要300毫秒,而我需要大约30毫秒,我的计算机CPU是I5-6400双核。我可以使用一些硬件来处理此代码以减少花费的时间吗?
现在我用过opencv,非常好,现在大约需要30毫秒。
void COpencvCutImg::BGR32_Cut_MultiBGR24(BYTE* source, BYTE** target, int width, int height, int row, int vertical)
{
Mat matSource = Mat(width, height, CV_8UC4, source);
int height1 = matSource.rows;
int width1 = matSource.cols;
int ceil_height = height1 / row;
int ceil_width = width1 / vertical;
Mat roi_img;
int seq = 0;
for (int i = 0; i<row; i++)
for (int j = 0; j<vertical; j++){
Rect rect(j*ceil_width, i*ceil_height, ceil_width, ceil_height);
roi_img = matSource(rect);
Mat continuousBGRA(roi_img.size(), CV_8UC3, target[seq]);
cv::cvtColor(roi_img, continuousBGRA, CV_BGRA2BGR, 3);
seq++;
}
}