C ++多重循环瓶颈

时间:2018-08-20 09:15:21

标签: c++

我的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++;
}

}

0 个答案:

没有答案