优化从openCV垫到2D浮点阵列的复制

时间:2015-06-08 09:42:13

标签: arrays opencv optimization mat

我想在2D浮点数组中复制一个opencv Mat变量。我使用下面的代码达到了这个目的。但是因为我开发了一个代码,速度是一个非常重要的指标,这种复制方法不够优化.Is还有另一种更优化的使用方式吗?

float *ImgSrc_f;
ImgSrc_f = (float *)malloc(512 * 512 * sizeof(float));
for(int i=0;i<512;i++)
    for(int j=0;j<512;j++)
    {
        ImgSrc_f[i * 512 + j]=ImgSrc.at<float>(i,j);
    }

2 个答案:

答案 0 :(得分:1)

真的,

//first method
Mat img_cropped = ImgSrc(512, 512).clone();
float *ImgSrc_f = img_cropped.data;

应该比最佳方法的效率低不超过几个百分点。我建议这个,只要第二种方法的损失不超过1%。

同样尝试这个,这非常接近绝对最佳方法,除非你可以使用某种扩展的cpu指令集(并且如果这样的指令集可用)。您可能会看到方法2和1之间的差异很小。

//method 2    
//preallocated memory

//largest possible with minimum number of direct copy calls
//caching pointer arithmetic can speed up things extremely minimally
//removing the Mat header with a malloc can speed up things minimally
>>startx, >>starty, >>ROI;
Mat img_roi = ImgSrc(ROI);
Mat img_copied(ROI.height, ROI.width, CV_32FC1);

for (int y = starty; y < starty+ROI.height; ++y)
{
    unsigned char* rowptr = img_roi.data + y*img_roi.step1() + startx * sizeof(float);
    unsigned char* rowptr2 = img_coped.data + y*img_copied.step1();
    memcpy(rowptr2, rowptr, ROI.width * sizeof(float));
}

基本上,如果你真的非常关心这些性能细节,你应该远离一般的超载运营商。代码中的抽象级别越高,惩罚成本越高。当然,这会使您的代码更加危险,更难阅读,并且容易出错。

答案 1 :(得分:0)

你也可以使用std :: vector结构吗?如果试试

std::vector<float> container;
container.assign((float*)matrix.startpos, (float*)matrix.endpos);