我正在尝试将图像拆分为偶数矩形,其中每个矩形中的行数取决于计算机中的处理器数量。
我的图像是720x601所以在4核上我的图像被分成4个矩形,尺寸为180x601。现在我试图在每个部分上面和下面增加4行。
运行我的代码我得到了一个本地启动和本地停止 localstart 0 localstop 179 localstart 180 localstop 359 localstart 360 localstop 539 localstart 540 localstop 719
当我在我的开始上方和下方采取额外的行时,停止变为 开始0停止183 开始176停止363 开始356停止543 开始536停止720
使用这些值我使用Rect函数
cv::Mat tmp = image(cv::Rect(x, start, image.cols, stop));
这应该给我4部分,上面的尺寸在开始和停止方面,但我得到我的第一部分的尺寸为0x183,秒部分获得尺寸: 183x601 363x601
localstart和localstop是根据用于创建负载平衡的方法计算的,以便将工作发送到每个处理器。
void parallelRange(int globalstart, int globalstop, int irank, int nproc, int& localstart, int& localstop, int& localcount)
{
int nrows = globalstop - globalstart + 1;
int divisor = nrows/nproc;
int remainder = nrows%nproc;
int offset;
if (irank < remainder) offset = irank;
else offset = remainder;
localstart = irank*divisor + globalstart + offset;
localstop = localstart + divisor - 1;
if (remainder > irank) localstop += 1;
localcount = localstop - localstart + 1;
}
然后它崩溃了一个断言说我没有数组边界。
我的代码是:
int start = std::max(0, localstart[irank] - blurLevel);
int stop = std::min(localstop[irank] + blurLevel, image.rows);
cv::Mat tmp = image(cv::Rect(x, start, image.cols, stop));
cout << tmp.rows << "x" << tmp.cols << endl;
img = matToBytes( tmp );
我希望有人能告诉我为什么在使用开始/停止时我的图像部分会变得奇怪。我在其他地方使用类似的代码来获得4个偶数段。