我想在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);
}
答案 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);