|
|
|
@ -2543,10 +2543,10 @@ namespace cv{ |
|
|
|
|
//Array used to store info and labeled pixel by each thread.
|
|
|
|
|
//Different threads affect different memory location of chunksSizeAndLabels
|
|
|
|
|
const int chunksSizeAndLabelsSize = h + 1; |
|
|
|
|
int *chunksSizeAndLabels = (int *)cv::fastMalloc(chunksSizeAndLabelsSize * sizeof(int)); |
|
|
|
|
cv::AutoBuffer<int, 0> chunksSizeAndLabels(chunksSizeAndLabelsSize); |
|
|
|
|
|
|
|
|
|
//Tree of labels
|
|
|
|
|
LabelT *P = (LabelT *)cv::fastMalloc(Plength * sizeof(LabelT)); |
|
|
|
|
cv::AutoBuffer<LabelT, 0> P(Plength); |
|
|
|
|
//First label is for background
|
|
|
|
|
P[0] = 0; |
|
|
|
|
|
|
|
|
@ -2555,30 +2555,27 @@ namespace cv{ |
|
|
|
|
|
|
|
|
|
//First scan, each thread works with chunk of img.rows/nThreads rows
|
|
|
|
|
//e.g. 300 rows, 4 threads -> each chunks is composed of 75 rows
|
|
|
|
|
cv::parallel_for_(range, FirstScan(img, imgLabels, P, chunksSizeAndLabels), nParallelStripes); |
|
|
|
|
cv::parallel_for_(range, FirstScan(img, imgLabels, P.data(), chunksSizeAndLabels.data()), nParallelStripes); |
|
|
|
|
|
|
|
|
|
//merge labels of different chunks
|
|
|
|
|
mergeLabels(img, imgLabels, P, chunksSizeAndLabels); |
|
|
|
|
mergeLabels(img, imgLabels, P.data(), chunksSizeAndLabels.data()); |
|
|
|
|
|
|
|
|
|
LabelT nLabels = 1; |
|
|
|
|
for (int i = 0; i < h; i = chunksSizeAndLabels[i]){ |
|
|
|
|
CV_Assert(i + 1 < chunksSizeAndLabelsSize); |
|
|
|
|
flattenL(P, LabelT((i + 1) / 2) * LabelT((w + 1) / 2) + 1, chunksSizeAndLabels[i + 1], nLabels); |
|
|
|
|
flattenL(P.data(), LabelT((i + 1) / 2) * LabelT((w + 1) / 2) + 1, chunksSizeAndLabels[i + 1], nLabels); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//Array for statistics data
|
|
|
|
|
StatsOp *sopArray = new StatsOp[h]; |
|
|
|
|
cv::AutoBuffer<StatsOp, 0> sopArray(h); |
|
|
|
|
sop.init(nLabels); |
|
|
|
|
|
|
|
|
|
//Second scan
|
|
|
|
|
cv::parallel_for_(range, SecondScan(img, imgLabels, P, sop, sopArray, nLabels), nParallelStripes); |
|
|
|
|
cv::parallel_for_(range, SecondScan(img, imgLabels, P.data(), sop, sopArray.data(), nLabels), nParallelStripes); |
|
|
|
|
|
|
|
|
|
StatsOp::mergeStats(imgLabels, sopArray, sop, nLabels); |
|
|
|
|
StatsOp::mergeStats(imgLabels, sopArray.data(), sop, nLabels); |
|
|
|
|
sop.finish(); |
|
|
|
|
|
|
|
|
|
delete[] sopArray; |
|
|
|
|
cv::fastFree(chunksSizeAndLabels); |
|
|
|
|
cv::fastFree(P); |
|
|
|
|
return nLabels; |
|
|
|
|
} |
|
|
|
|
};//End struct LabelingGranaParallel
|
|
|
|
|