@@ -288,7 +288,7 @@ namespace cv{
288
288
int r = range.start ;
289
289
chunksSizeAndLabels_[r] = range.end ;
290
290
291
- LabelT label = LabelT ((r * imgLabels_.cols + 1 ) / 2 + 1 ) ;
291
+ LabelT label = LabelT ((r + 1 ) / 2 ) * LabelT (( imgLabels_.cols + 1 ) / 2 ) + 1 ;
292
292
293
293
const LabelT firstLabel = label;
294
294
const int w = img_.cols ;
@@ -615,6 +615,10 @@ namespace cv{
615
615
616
616
// merge labels of different chunks
617
617
mergeLabels8Connectivity (imgLabels, P, chunksSizeAndLabels);
618
+
619
+ for (int i = 0 ; i < h; i = chunksSizeAndLabels[i]){
620
+ flattenL (P, int ((i + 1 ) / 2 ) * int ((w + 1 ) / 2 ) + 1 , chunksSizeAndLabels[i + 1 ], nLabels);
621
+ }
618
622
}
619
623
else {
620
624
// First scan, each thread works with chunk of img.rows/nThreads rows
@@ -623,10 +627,10 @@ namespace cv{
623
627
624
628
// merge labels of different chunks
625
629
mergeLabels4Connectivity (imgLabels, P, chunksSizeAndLabels);
626
- }
627
-
628
- for ( int i = 0 ; i < h; i = chunksSizeAndLabels[i]){
629
- flattenL (P, (i * w + 1 ) / 2 + 1 , chunksSizeAndLabels[i + 1 ], nLabels);
630
+
631
+ for ( int i = 0 ; i < h; i = chunksSizeAndLabels[i]){
632
+ flattenL (P, int (i * w + 1 ) / 2 + 1 , chunksSizeAndLabels[i + 1 ], nLabels);
633
+ }
630
634
}
631
635
632
636
// Array for statistics dataof threads
@@ -842,7 +846,7 @@ namespace cv{
842
846
843
847
chunksSizeAndLabels_[r] = range.end + (range.end % 2 );
844
848
845
- LabelT label = LabelT ((r + 1 ) * ( imgLabels_.cols + 1 ) / 4 ) ;
849
+ LabelT label = LabelT ((r + 1 ) / 2 ) * LabelT (( imgLabels_.cols + 1 ) / 2 ) + 1 ;
846
850
847
851
const LabelT firstLabel = label;
848
852
const int h = img_.rows , w = img_.cols ;
@@ -2540,7 +2544,7 @@ namespace cv{
2540
2544
// 0 0 0 0 0...
2541
2545
// 1 0 1 0 1...
2542
2546
// ............
2543
- const size_t Plength = (( size_t (h) + 1 ) * ( size_t (w) + 1 )) / 4 + 1 ;
2547
+ const size_t Plength = size_t (((h + 1 ) / 2 ) * size_t ((w + 1 ) / 2 )) + 1 ;
2544
2548
2545
2549
// Array used to store info and labeled pixel by each thread.
2546
2550
// Different threads affect different memory location of chunksSizeAndLabels
@@ -2562,7 +2566,7 @@ namespace cv{
2562
2566
2563
2567
LabelT nLabels = 1 ;
2564
2568
for (int i = 0 ; i < h; i = chunksSizeAndLabels[i]){
2565
- flattenL (P, ( i + 1 ) * ( w + 1 ) / 4 , chunksSizeAndLabels[i + 1 ], nLabels);
2569
+ flattenL (P, LabelT (( i + 1 ) / 2 ) * LabelT (( w + 1 ) / 2 ) + 1 , chunksSizeAndLabels[i + 1 ], nLabels);
2566
2570
}
2567
2571
2568
2572
// Array for statistics data
@@ -2602,7 +2606,7 @@ namespace cv{
2602
2606
// 0 0 0 0 0...
2603
2607
// 1 0 1 0 1...
2604
2608
// ............
2605
- const size_t Plength = (( size_t (h) + 1 ) * ( size_t (w) + 1 )) / 4 + 1 ;
2609
+ const size_t Plength = size_t (((h + 1 ) / 2 ) * size_t ((w + 1 ) / 2 )) + 1 ;
2606
2610
2607
2611
LabelT *P = (LabelT *)fastMalloc (sizeof (LabelT) *Plength);
2608
2612
P[0 ] = 0 ;
0 commit comments