-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmotionES.cpp
More file actions
executable file
·990 lines (938 loc) · 41.6 KB
/
motionES.cpp
File metadata and controls
executable file
·990 lines (938 loc) · 41.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
// MBSIZE : 簛E?榈拇笮�
// P : 搜索步长参数
#define MBSIZE 16
#define P 9
#include "motionES.h"
#include <cmath>
#include "string.h"
//#include <stdafx.h>
const struct Point{int x;int y;};
const Point LDSP[9]={{0,-2},{-1,-1},{1,-1},{-2,0},{0,0},{2,0},{-1,1},{1,1},{0,2}};
const Point SDSP[5]={{0,-1},{-1,0},{0,0},{1,0},{0,1}};
//********************************************************************************************
// TSS算法——P越大,搜索窗口越大,计算量越大,MBSIZE愈大,搜索的运动矢量少,计算量小,效果阐靠
//
// 输葋E
// imgI : 参考图蟻E
// imgP : 要寻找运动矢量的图蟻E
// imgComp : 补偿后图像的数据区的指諄E
// imgWidth : 图像的窥胰
// imgHeight: 图像的窥胰
// 输硜E
// motionvector: 图像估计的运动矢量矩諄E
// TSScomputations: TSS算法的计算量
//*********************************************************************************************
void motionEstTSS(unsigned char *imgP, unsigned char* imgI, int imgWidth, int imgHeight, int motionVect[2][MAX], double* TSScomputations)
{
//初始化参数
double costs[3][3]={{65537,65537,65537},{65537,65537,65537},{65537,65537,65537}};
double computations = 0;
int L = 0;
int stepMax = 0;
int vectorsNum = 0;
// 计算所需要的畜步数
L= (int)floor(log10(P+1.0)/log10(2.0)); //p=7,s=4
stepMax = (int)pow(2.0,(L-1));
vectorsNum =(int)(imgWidth*imgHeight/pow((double)MBSIZE,2));
//动态分艁E
//初始化运动矢量为羴E
int vectors[2][MAX] ={0};//int vectors[2][vectorsNum] ;
// 从图像左上角开始,说明像块的中心点在左上角处开始
//步长为MBSIZE,我们寻找的每个簛E?樗阉髌渖舷伦笥襭像素处的匹艁E
int mbCount = 1;
int i,j;
for( i = 0; i< imgHeight;i+=MBSIZE)//防止溢硜E-图像必衼E荕BSIZE^2整数倍?周边的模块不去运藖E
{
for(j = 0; j<imgWidth;j+=MBSIZE)
{
//对于三步法,每一步我们评估周围的9部分找出猊配的
double pVector[3]={0,0,0};//----------[dx,dy,min]
int x = j;//图像的列
int y = i;//图像的行
int k,t;
int stepSize;
// 为了避免对搜索中心的反复计算,我们存储其前一次运行得到的数值。
//对于第一次祦E颐前汛酥荡娣诺窖分猓婧蟮牡丒颐前阎荡娣诺揭贫沟男轮行牡愦�
//动态分配二维数讈E
unsigned char** imgPtmp;
unsigned char** imgItmp;
imgPtmp = new unsigned char*[MBSIZE];
imgItmp = new unsigned char*[MBSIZE];
for (k=0;k<MBSIZE;k++)
{
imgPtmp[k]=new unsigned char[MBSIZE];
memset(imgPtmp[k],0,MBSIZE*sizeof(unsigned char));//新建内存区莵E丒
}
for (k=0;k<MBSIZE;k++)
{
imgItmp[k]=new unsigned char[MBSIZE];
memset(imgItmp[k],0,MBSIZE*sizeof(unsigned char));//新建内存区莵E丒
}
for(int blkX=0;blkX<MBSIZE;blkX++)
{
for(int blkY=0;blkY<MBSIZE;blkY++)
{
int MAX1=0,MAX2=0;//防溢硜E
//为了避免溢硜E!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!过了则补上边缘
MAX1 =((i+blkY)*imgWidth+(j+blkX)<=(imgWidth*imgHeight-1))?(i+blkY)*imgWidth+(j+blkX):(imgWidth*imgHeight-1);
*(imgPtmp[blkX]+blkY) = *(imgP+MAX1);
*(imgItmp[blkX]+blkY) = *(imgI+MAX1);
}
}
// costs(2,2) = costFuncMAD(imgP(i:i+MBSIZE-1,j:j+MBSIZE-1), ...
// imgI(i:i+MBSIZE-1,j:j+MBSIZE-1),MBSIZE);
//强制转换开销值为整数
//循环前先计算参考中心处开蟻E
costs[1][1] = costFuncMAD(imgPtmp,imgItmp,MBSIZE);
computations = computations + 1;
stepSize = stepMax;
while(stepSize >= 1)
{
int m,n;
int dx,dy;
double min;
// m 是行或者垂直搜索参数
// n 是列或者水平搜索参数
for( m = -stepSize;m <= stepSize ; m += stepSize)
{
for( n = -stepSize;n <= stepSize ; n += stepSize)
{
int refBlkVer,refBlkHor;
int costRow,costCol;
refBlkVer = y + m; // 参考块的行,垂直坐眮E
refBlkHor = x + n; // 参考縼E牧校阶丒
// if (( refBlkVer < 1 )||( refBlkVer+MBSIZE-1 > imgHeight)|| (refBlkHor < 1 )|| (refBlkHor+MBSIZE-1)> imgWidth)
if (( refBlkVer < 0 )||( refBlkVer+MBSIZE > imgHeight)|| (refBlkHor < 0 )|| (refBlkHor+MBSIZE)> imgWidth)
continue;
//生成cost矩阵的行列坐眮E阉飨卤丒
costRow = m/stepSize + 1;//0~2
costCol = n/stepSize + 1;//0~2
//中心处跳硜E
if (costRow == 1 && costCol == 1)
continue;
for(int blkX2=0;blkX2<MBSIZE;blkX2++)
{
for(int blkY2=0;blkY2<MBSIZE;blkY2++)
{
int MAX1=0,MAX2=0;//防溢硜E
//为了避免溢硜E!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!过了则补上边缘
MAX1 =((i+blkY2)*imgWidth+(j+blkX2)<=(imgWidth*imgHeight-1))?(i+blkY2)*imgWidth+(j+blkX2):(imgWidth*imgHeight-1);
MAX2 =(((refBlkVer+blkY2)*imgWidth+(refBlkHor+blkX2))<=(imgWidth*imgHeight-1))?((refBlkVer+blkY2)*imgWidth+(refBlkHor+blkX2)):(imgWidth*imgHeight-1);
*(imgPtmp[blkX2]+blkY2) = *(imgP+MAX1);
*(imgItmp[blkX2]+blkY2) = *(imgI+MAX2);
}
}
costs[costRow][costCol] = costFuncMAD(imgPtmp,imgItmp,MBSIZE);
// costs(costRow, costCol ) = costFuncMAD(imgP(i:i+MBSIZE-1,j:j+MBSIZE-1), ...
// imgI(refBlkVer:refBlkVer+MBSIZE-1, refBlkHor:refBlkHor+MBSIZE-1), MBSIZE);
computations = computations + 1;//运算量加一
}
}
// 到此我们找到臁开销并且存储该值
minCost(costs,pVector); // finds which macroblock in imgI gave us min Cost
dx = (int)(pVector[0]);//dx.dy都是0~2不是1~3
dy = (int)(pVector[1]);
min = pVector[2];
// 将搜索窗口坐眮E丒碌阶】�
x = x + (dx-1)*stepSize;
y = y + (dy-1)*stepSize;
// Arohs thought: At this point we can check and see if the shifted co-ordinates are exactly the same
//as the root co-ordinates of the last step, then we check them against a preset threshold,
//and ifthe cost is less then that, than we can exit from teh loop right here.
//This way we can save more computations. However, as this is not implemented in the paper I am modeling,
//am not incorporating this test. May be later...as my own addition to the algorithm
// 搜索步长减皝E
stepSize = stepSize / 2;
// 参考中心的开销值竵E挛壳白ヅ浯Φ�
costs[1][1] = costs[dy][dx];
}
//判断是否写溢硜E
if(mbCount>vectorsNum)
mbCount = vectorsNum;
vectors[0][mbCount-1] = y - i; // 运动矢量的行坐眮E
vectors[1][mbCount-1] = x - j; // 运动矢量的列坐眮E
//模块计数加一
mbCount = mbCount + 1;
// costs[3][3]={{65537,65537,65537},{65537,65537,65537},{65537,65537,65537}};
//将开销函数复原---有其他简单方法么?
for(k=0;k<3;k++) //memset(costs,65537,3*sizeof(int));//memset按字符操作导致65537截断成01,int 占2字节,产蓙E010101---16843009,结果不对!!!
{
for(t=0;t<3;t++)
costs[k][t]=65537;
} //释放内磥E
for (k=0;k<MBSIZE;k++)
delete []imgPtmp[k];
for (k=0;k<MBSIZE;k++)
delete []imgItmp[k];
delete []imgPtmp;
delete []imgItmp;
}
}
for(i=0;i<2;i++)
{
for(j=0;j<MAX;j++)
{
if(j>=vectorsNum)
motionVect[i][j]=0;
else
motionVect[i][j]=vectors[i][j];
}
}
*TSScomputations = computations/(mbCount - 1);
}
//*******************************************************************************************
// 计算补偿后图像的PSNR
// 输葋E
// imgP: 原图
// imgComp:补偿后图蟻E
// imgHeight: 图像的高
// imgWidth: 图像的縼E
// n : 图像像素的赃峰峰值
// 输硜E
// psnr:补偿图像的峰值信詠E�
//******************************************************************************************
double psnr(unsigned char* imgP,unsigned char* imgComp,int imgWidth,int imgHeight,int n)
{
double err = 0;
double mse,psnr;
int i,j;
for (i=0;i<imgHeight;i++)
{
for(j=0;j<imgWidth;j++)
{
err = err + pow(double(*(imgP+i*imgWidth+j) - *(imgComp+i*imgWidth+j)),2);
}
}
mse = err / (imgHeight*imgWidth);
psnr = 10*log10(n*n/mse);
return psnr;
}
//****************************************************************************
// 对两个块计算平均绝对误瞾E
// 输葋E
// currentBlk : 计算MAD值的像縼E
// refBlk : 计算MAD值的参考像縼E
// 输硜E
// cost : 两像块MAD值
//******************************************************************************
double costFuncMAD(unsigned char** currentBlk,unsigned char** refBlk,int mbSize)
{
double err = 0;
double cost;
int i,j;
for(i = 0;i<mbSize;i++)
{
for(j = 0;j<mbSize;j++)
{
err = err + labs(*(currentBlk[i]+j) - *(refBlk[i]+j));
}
}
cost = err / (mbSize*mbSize);
return cost;
}
//****************************************************************************
// 找到臁开销矩阵的臁值的下眮E
//
// 输葋E
// costs : 簛E?榭卣丒
//
// 输硜E
// pVector: dx,dy,min输出臁块的列,行坐眮E妥≈�
//****************************************************************************
void minCost(double costs[3][3],double pVector[] )
{
//初始化
double min = *(costs[1]+1);
double dx=1,dy=1;
int i,j;
for(i =0; i< 3;i++)
{
for(j =0; j< 3;j++)
{
if (*(costs[i]+j) < min)
{
min = *(costs[i]+j);
dx = j; dy = i;
}
}
}
pVector[0]=dx;
pVector[1]=dy;
pVector[2]=min;
}
//*****************************************************************************
// 根据运动估计矢量生成运动补偿图蟻E
//
// 输葋E
// imgI : 参考图蟻E
// motionVect : 估计运动矢量矩諄E
// MBSIZE : 簛E?榇笮�
/// imgWidth : 图像窥胰
// imgHeight: 图像的高度
// 输硜E
// imgComp :补偿图像数据指諄E
//*****************************************************************************
void motionComp(unsigned char* imgI,int mbSize,int imgWidth,int imgHeight,int motionVect[2][MAX],unsigned char*imgComp)
{
int mbCount = 1;
int i,j;
//指示是否输葋E枷袷荕BSIZE的整数倍
int xExtra,yExtra;
for(i = 0; i<imgHeight; i+= mbSize) //运动补偿图像的产生需要循环所有像素
{
for(j = 0; j<imgWidth; j+=mbSize)
{
// dy 行 垂直坐眮E
// dx 列 水平坐眮E
xExtra = imgWidth-j;//残阐楷煮一次等于0则整数倍 图像的列
yExtra = imgHeight-i;
int dy,dx,refBlkVer,refBlkHor;
dy = motionVect[0][mbCount-1];//读硜E858993460
dx = motionVect[1][mbCount-1];
refBlkVer = i + dy;
refBlkHor = j + dx;
//像块运动补偿,中心点在像块左上角
for(int m=0;m<mbSize;m++)
{
for(int n=0;n<mbSize;n++)
{
int MAX1 = 0,MAX2 = 0;
//为了避免溢硜E!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!过了则补上边缘
MAX1 = ((refBlkVer+m)*imgWidth+(refBlkHor+n)<=(imgWidth*imgHeight-1))?((refBlkVer+m)*imgWidth+(refBlkHor+n)):(imgWidth*imgHeight-1);
MAX2 = (((i+m)*imgWidth+(n+j))<=(imgWidth*imgHeight-1))?((i+m)*imgWidth+(n+j)):(imgWidth*imgHeight-1);
imgComp[MAX2]= imgI[MAX1];
// imageComp(i:i+MBSIZE-1,j:j+MBSIZE-1) = imgI(refBlkVer:refBlkVer+MBSIZE-1, refBlkHor:refBlkHor+MBSIZE-1);
}
}
mbCount = mbCount + 1;
}
}
if(yExtra!=0)//非整数倍
if(xExtra==0)
for(i=imgHeight-1;i>=imgHeight-1-yExtra;i--)
for(j=0;j<imgWidth;j++)
{
imgComp[i*imgWidth+j]= imgI[i*imgWidth+j];
}
else
{
for(i=imgHeight-1;i>=imgHeight-1-yExtra;i--)
for(j=0;j<imgWidth;j++)
{
imgComp[i*imgWidth+j]= imgI[i*imgWidth+j];
}
for(i=0;i<imgHeight-yExtra;i++)
for(j=imgWidth-1;j>=imgWidth-1-xExtra;j--)
{
imgComp[i*imgWidth+j]= imgI[i*imgWidth+j];
}
}
else
;
}
//***************************************************************************************************/
//计算一维矩阵的臁值和其所在的下眮E
//输葋E
//matrix:N个元素矩諄E
//N: 矩阵长度,为奇数
//minNum:矩阵中的臁值
//index:矩阵臁值的索引
//***************************************************************************************************
void minSearch(double* matrix,int N,double* minNum,int* index)
{
//初始臁在中紒E
int i,k;
double value;
k = (N-1)/2;
value = *(matrix+k);
for(i=0;i<N;i++)
{
if(*(matrix+i)<*(matrix+k))
{
k = i;
value = *(matrix+i);
}
}
*index = k;
*minNum =value;
}
//********************************************************************************************
// DS运动估计算法---蛘匹配块设置在中心点为中心,P为皝E兜姆娇蚰冢孀臥增大计算量增大,效果变好,MBSIZE变小计算量增大,效果变好?
//
// 输葋E
// imgI : 参考图蟻E
// imgP : 要寻找运动矢量的图蟻E
// imgComp : 补偿后图像的数据区的指諄E
// imgWidth : 图像的窥胰
// imgHeight: 图像的窥胰
// 输硜E
// motionvector: 图像估计的运动矢量矩諄E
// DScomputations: DS算法的计算量
//*********************************************************************************************
void motionEstDS(unsigned char *imgP, unsigned char* imgI, int imgWidth, int imgHeight, int motionVect[2][MAX], double* DScomputations)
{
//初始化参数
int vectorsNum = 0;
double costs[9];
double computations = 0;
int L = 0;
// 计算所需要的畜步数
L= (int)floor(log10(P+1.0)/log10(2.0)); //p=7
vectorsNum =(int)(imgWidth*imgHeight/pow((double)MBSIZE,2));
//动态分艁E
//初始化运动矢量为羴E
int vectors[2][MAX] ={0};//int vectors[2][vectorsNum] ;
// 从图像左上角开始,说明像块的中心点在左上角处开始
//步长为MBSIZE,我们寻找的每个簛E?樗阉髌渖舷伦笥襭像素处的匹艁E
int mbCount = 1;
int i=0,j=0;
//初始化开销矩諄E
for(j=0;j<9;j++)
{
costs[j]=65537;
}
int SDSPFlag;//大菱形中心眮E�
int cornerFlag;//大菱形角点眮E�
// 从图像左上角开始,说明像块的中心点在左上角处开始
//步长为MBSIZE,我们寻找的每个簛E?樗阉髌渖舷伦笥襭像素处的匹艁E
for( i = 0; i< imgHeight;i+=MBSIZE)//防止溢硜E-图像必衼E荕BSIZE^2整数倍?周边的模块不去运藖E
{
// if(i == 128)
// {
// i = i;
// }
for(j = 0; j<imgWidth;j+=MBSIZE)
{
// if(j == 42)
// {
// j = j;
// }
double costsSDSP[5]={65537,65537,65537,65537,65537};
double cost[1]={65535};//costs 中臁值
int point[1]={4};// costs 中臁值的坐眮E
double costSDSP[1]={65535};
int pointSDSP[1]={4};
int xLast,yLast;//存储上一次的中心坐眮E
//对于三步法,每一步我们评估周围的9部分找出猊配的
int x = j;//图像的列
int y = i;//图像的行
int k;
// 为了避免对搜索中心的反复计算,我们存储其前一次运行得到的数值。
//对于第一次祦E颐前汛酥荡娣诺窖分猓婧蟮牡丒颐前阎荡娣诺揭贫沟男轮行牡愦�
//动态分配二维数讈E
unsigned char** imgPtmp;
unsigned char** imgItmp;
imgPtmp = new unsigned char*[MBSIZE];
imgItmp = new unsigned char*[MBSIZE];
for (k=0;k<MBSIZE;k++)
{
imgPtmp[k]=new unsigned char[MBSIZE];
memset(imgPtmp[k],0,MBSIZE*sizeof(unsigned char));//新建内存区莵E丒
}
for (k=0;k<MBSIZE;k++)
{
imgItmp[k]=new unsigned char[MBSIZE];
memset(imgItmp[k],0,MBSIZE*sizeof(unsigned char));//新建内存区莵E丒
}
for(int blkX=0;blkX<MBSIZE;blkX++)
{
for(int blkY=0;blkY<MBSIZE;blkY++)
{
int MAX1=0;
//为了避免溢硜E!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!过了则补上边缘
MAX1 =((i+blkY)*imgWidth+(j+blkX)<=(imgWidth*imgHeight-1))?(i+blkY)*imgWidth+(j+blkX):(imgWidth*imgHeight-1);
*(imgPtmp[blkX]+blkY) = *(imgP+MAX1);
*(imgItmp[blkX]+blkY) = *(imgI+MAX1);
}
}
// costs(5) = costFuncMAD(imgP(i:i+MBSIZE-1,j:j+MBSIZE-1), ...
// imgI(i:i+MBSIZE-1,j:j+MBSIZE-1),MBSIZE);
//循环前先计算参考中心处开蟻E
costs[4] = costFuncMAD(imgPtmp,imgItmp,MBSIZE);
computations = computations + 1;
//**************************************LDSP初次搜藖E***************************************//
for(k=0;k<9;k++)
{
int refBlkVer,refBlkHor;
refBlkVer = y + LDSP[k].y;//参考块的行、垂直坐眮E
refBlkHor = x + LDSP[k].x;//参考块的列、水平坐眮E
if( refBlkVer < 0 || refBlkVer+MBSIZE > imgHeight || refBlkHor < 0 || refBlkHor+MBSIZE > imgWidth)
continue;
if (k == 4)
continue;
for(int blkX2=0;blkX2<MBSIZE;blkX2++)
{
for(int blkY2=0;blkY2<MBSIZE;blkY2++)
{
int MAX1=0,MAX2=0;
//为了避免溢硜E!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!过了则补上边缘
MAX1 =((i+blkY2)*imgWidth+(j+blkX2)<=(imgWidth*imgHeight-1))?((i+blkY2)*imgWidth+(j+blkX2)):(imgWidth*imgHeight-1);
MAX2 =(((refBlkVer+blkY2)*imgWidth+(refBlkHor+blkX2))<=(imgWidth*imgHeight-1))?((refBlkVer+blkY2)*imgWidth+(refBlkHor+blkX2)):(imgWidth*imgHeight-1);
*(imgPtmp[blkX2]+blkY2) = *(imgP+MAX1);
*(imgItmp[blkX2]+blkY2) = *(imgI+MAX2);
}
}
costs[k] = costFuncMAD(imgPtmp,imgItmp,MBSIZE);
computations = computations + 1;
}
//******************************一次全LDSP搜索结蕘E***************************************//
//第一次调用计算初始搜索@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@//
minSearch(costs,9,cost,point);
// 菱形中褋EDSPFlag 眮E局�1---历捋上没有位移的话应该蛠E睾希琒DSPFlag始终为1,point[0]不是4就是2
if (point[0] == 4)
SDSPFlag = 1;
else
{
SDSPFlag = 0;
if ( abs(LDSP[point[0]].x) == abs(LDSP[point[0]].y) )
cornerFlag = 0;
else
cornerFlag = 1; //角点眮E�
xLast = x;
yLast = y;
//搜索中心移到新的中心
x = x + LDSP[point[0]].x;
y = y + LDSP[point[0]].y;
for(int index=0;index<9;index++)
{
costs[index]=65537;
}
//中心值变成臁值
costs[4] = cost[0];
}
//**********************************LDSP循环搜藖E****************************************//
while (SDSPFlag == 0)//LDSP搜索至SDSPFlag =1为止,分成角点和非角点两纴E
{
if (cornerFlag == 1)
//排除非角点和中心点,计算角点处的开蟻E
for(int k=0;k<9;k++)
{
int refBlkVer,refBlkHor;
refBlkVer = y + LDSP[k].y;
refBlkHor = x + LDSP[k].x;
if( refBlkVer < 0 || refBlkVer+MBSIZE > imgHeight || refBlkHor < 0 || refBlkHor+MBSIZE > imgWidth)
continue;
if (k == 4)
continue;
if ( refBlkHor >= xLast - 1 && refBlkHor <= xLast + 1 && refBlkVer >= yLast - 1 && refBlkVer <= yLast + 1 )//非角点组成的正方形区域内
continue;// 移除正方形区域内的三个祦E
else if (refBlkHor < j-P || refBlkHor > j+P || refBlkVer < i-P || refBlkVer > i+P)//搜索窗口之蛠E
continue;
else
{
for(int blkX2=0;blkX2<MBSIZE;blkX2++)
{
for(int blkY2=0;blkY2<MBSIZE;blkY2++)
{
int MAX1=0,MAX2=0;
//为了避免溢硜E!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!过了则补上边缘
MAX1 =((i+blkY2)*imgWidth+(j+blkX2)<=(imgWidth*imgHeight-1))?(i+blkY2)*imgWidth+(j+blkX2):(imgWidth*imgHeight-1);
MAX2 =(((refBlkVer+blkY2)*imgWidth+(refBlkHor+blkX2))<=(imgWidth*imgHeight-1))?((refBlkVer+blkY2)*imgWidth+(refBlkHor+blkX2)):(imgWidth*imgHeight-1);
*(imgPtmp[blkX2]+blkY2) = *(imgP+MAX1);
*(imgItmp[blkX2]+blkY2) = *(imgI+MAX2);
}
}
costs[k] = costFuncMAD(imgPtmp,imgItmp,MBSIZE);//一般情况计藖E祦E
// costs[k] = costFuncMAD(imgP(i:i+MBSIZE-1,j:j+MBSIZE-1), imgI(refBlkVer:refBlkVer+MBSIZE-1, refBlkHor:refBlkHor+MBSIZE-1), MBSIZE);
computations = computations + 1;
}
}
else//非角点,4种情况讨论
{
switch (point[0])// 1 2 6 7
{
case '1': // just 3 block 1 2 4
{
int refBlkVer,refBlkHor;
refBlkVer = y + LDSP[0].y;
refBlkHor = x + LDSP[0].x;
if( refBlkVer < 0 || refBlkVer+MBSIZE > imgHeight || refBlkHor < 0 || refBlkHor+MBSIZE > imgWidth)
;
else if (refBlkHor < j-P || refBlkHor > j+P || refBlkVer < i-P || refBlkVer > i+P)
;
else
{
for(int blkX2=0;blkX2<MBSIZE;blkX2++)
{
for(int blkY2=0;blkY2<MBSIZE;blkY2++)
{
int MAX1=0,MAX2=0;
//为了避免溢硜E!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!过了则补上边缘
MAX1 =((i+blkY2)*imgWidth+(j+blkX2)<=(imgWidth*imgHeight-1))?(i+blkY2)*imgWidth+(j+blkX2):(imgWidth*imgHeight-1);
MAX2 =(((refBlkVer+blkY2)*imgWidth+(refBlkHor+blkX2))<=(imgWidth*imgHeight-1))?((refBlkVer+blkY2)*imgWidth+(refBlkHor+blkX2)):(imgWidth*imgHeight-1);
*(imgPtmp[blkX2]+blkY2) = *(imgP+MAX1);
*(imgItmp[blkX2]+blkY2) = *(imgI+MAX2);
}
}
costs[0] = (int) costFuncMAD(imgPtmp,imgItmp,MBSIZE);
computations = computations + 1;
}
refBlkVer = y + LDSP[1].y;
refBlkHor = x + LDSP[1].x;
if( refBlkVer < 0 || refBlkVer+MBSIZE > imgHeight || refBlkHor < 0 || refBlkHor+MBSIZE > imgWidth)
; //图像边缘之外,跳硜E
else if (refBlkHor < j-P || refBlkHor > j+P || refBlkVer < i-P || refBlkVer > i+P)
; //搜索窗口之外,跳硜E
else
{
for(int blkX2=0;blkX2<MBSIZE;blkX2++)
{
for(int blkY2=0;blkY2<MBSIZE;blkY2++)
{
int MAX1=0,MAX2=0;
//为了避免溢硜E!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!过了则补上边缘
MAX1 =((i+blkY2)*imgWidth+(j+blkX2)<=(imgWidth*imgHeight-1))?(i+blkY2)*imgWidth+(j+blkX2):(imgWidth*imgHeight-1);
MAX2 =(((refBlkVer+blkY2)*imgWidth+(refBlkHor+blkX2))<=(imgWidth*imgHeight-1))?((refBlkVer+blkY2)*imgWidth+(refBlkHor+blkX2)):(imgWidth*imgHeight-1);
*(imgPtmp[blkX2]+blkY2) = *(imgP+MAX1);
*(imgItmp[blkX2]+blkY2) = *(imgI+MAX2);
}
}
costs[1] = costFuncMAD(imgPtmp,imgItmp,MBSIZE);
computations = computations + 1;
}
refBlkVer = y + LDSP[3].y;
refBlkHor = x + LDSP[3].x;
if( refBlkVer < 0 || refBlkVer+MBSIZE > imgHeight || refBlkHor < 0 || refBlkHor+MBSIZE > imgWidth)
; //图像边缘之外,跳硜E
else if (refBlkHor < j-P || refBlkHor > j+P || refBlkVer < i-P || refBlkVer > i+P)
; //搜索窗口之外,跳硜E
else
{
for(int blkX2=0;blkX2<MBSIZE;blkX2++)
{
for(int blkY2=0;blkY2<MBSIZE;blkY2++)
{
int MAX1=0,MAX2=0;
//为了避免溢硜E!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!过了则补上边缘
MAX1 =((i+blkY2)*imgWidth+(j+blkX2)<=(imgWidth*imgHeight-1))?(i+blkY2)*imgWidth+(j+blkX2):(imgWidth*imgHeight-1);
MAX2 =(((refBlkVer+blkY2)*imgWidth+(refBlkHor+blkX2))<=(imgWidth*imgHeight-1))?((refBlkVer+blkY2)*imgWidth+(refBlkHor+blkX2)):(imgWidth*imgHeight-1);
*(imgPtmp[blkX2]+blkY2) = *(imgP+MAX1);
*(imgItmp[blkX2]+blkY2) = *(imgI+MAX2);
}
}
costs[3] = costFuncMAD(imgPtmp,imgItmp,MBSIZE);
computations = computations + 1;
break;
}
}
case '2': // three blocks 1 3 6
{
int refBlkVer,refBlkHor;
refBlkVer = y + LDSP[0].y;
refBlkHor = x + LDSP[0].x;
if ( refBlkVer < 0 || refBlkVer+MBSIZE > imgHeight|| refBlkHor < 0 || refBlkHor+MBSIZE> imgWidth)
;
else if (refBlkHor < j-P || refBlkHor > j+P || refBlkVer < i-P || refBlkVer > i+P)
;
else
{
for(int blkX2=0;blkX2<MBSIZE;blkX2++)
{
for(int blkY2=0;blkY2<MBSIZE;blkY2++)
{
int MAX1=0,MAX2=0;
//为了避免溢硜E!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!过了则补上边缘
MAX1 =((i+blkY2)*imgWidth+(j+blkX2)<=(imgWidth*imgHeight-1))?(i+blkY2)*imgWidth+(j+blkX2):(imgWidth*imgHeight-1);
MAX2 =(((refBlkVer+blkY2)*imgWidth+(refBlkHor+blkX2))<=(imgWidth*imgHeight-1))?((refBlkVer+blkY2)*imgWidth+(refBlkHor+blkX2)):(imgWidth*imgHeight-1);
*(imgPtmp[blkX2]+blkY2) = *(imgP+MAX1);
*(imgItmp[blkX2]+blkY2) = *(imgI+MAX2);
}
}
costs[0] = costFuncMAD(imgPtmp,imgItmp,MBSIZE);
computations = computations + 1;
}
refBlkVer = y + LDSP[2].y;
refBlkHor = x + LDSP[2].x;
if( refBlkVer < 0 || refBlkVer+MBSIZE > imgHeight || refBlkHor < 0 || refBlkHor+MBSIZE > imgWidth)
;//图像边缘之外,跳硜E
else if (refBlkHor < j-P || refBlkHor > j+P || refBlkVer < i-P || refBlkVer > i+P)
; //搜索窗口之外,跳硜E
else
{
for(int blkX2=0;blkX2<MBSIZE;blkX2++)
{
for(int blkY2=0;blkY2<MBSIZE;blkY2++)
{
int MAX1=0,MAX2=0;
//为了避免溢硜E!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!过了则补上边缘
MAX1 =((i+blkY2)*imgWidth+(j+blkX2)<=(imgWidth*imgHeight-1))?(i+blkY2)*imgWidth+(j+blkX2):(imgWidth*imgHeight-1);
MAX2 =(((refBlkVer+blkY2)*imgWidth+(refBlkHor+blkX2))<=(imgWidth*imgHeight-1))?((refBlkVer+blkY2)*imgWidth+(refBlkHor+blkX2)):(imgWidth*imgHeight-1);
*(imgPtmp[blkX2]+blkY2) = *(imgP+MAX1);
*(imgItmp[blkX2]+blkY2) = *(imgI+MAX2);
}
}
costs[2] = costFuncMAD(imgPtmp,imgItmp,MBSIZE);
computations = computations + 1;
}
refBlkVer = y + LDSP[5].y;
refBlkHor = x + LDSP[5].x;
if( refBlkVer < 0 || refBlkVer+MBSIZE > imgHeight || refBlkHor < 0 || refBlkHor+MBSIZE > imgWidth)
;//图像边缘之外,跳硜E
else if (refBlkHor < j-P || refBlkHor > j+P || refBlkVer < i-P || refBlkVer > i+P)
;//搜索窗口之外,跳硜E
else
{
for(int blkX2=0;blkX2<MBSIZE;blkX2++)
{
for(int blkY2=0;blkY2<MBSIZE;blkY2++)
{
int MAX1=0,MAX2=0;
//为了避免溢硜E!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!过了则补上边缘
MAX1 =((i+blkY2)*imgWidth+(j+blkX2)<=(imgWidth*imgHeight-1))?(i+blkY2)*imgWidth+(j+blkX2):(imgWidth*imgHeight-1);
MAX2 =(((refBlkVer+blkY2)*imgWidth+(refBlkHor+blkX2))<=(imgWidth*imgHeight-1))?((refBlkVer+blkY2)*imgWidth+(refBlkHor+blkX2)):(imgWidth*imgHeight-1);
*(imgPtmp[blkX2]+blkY2) = *(imgP+MAX1);
*(imgItmp[blkX2]+blkY2) = *(imgI+MAX2);
}
}
costs[5] = costFuncMAD(imgPtmp,imgItmp,MBSIZE);
computations = computations + 1;
}
break;
}
case '6': // three blocks 4 7 9
{
int refBlkVer,refBlkHor;
refBlkVer = y + LDSP[3].y;
refBlkHor = x + LDSP[3].x;
if ( refBlkVer < 0 || refBlkVer+MBSIZE> imgHeight|| refBlkHor < 0 || refBlkHor+MBSIZE > imgWidth)
;
else if (refBlkHor < j-P || refBlkHor > j+P || refBlkVer < i-P || refBlkVer > i+P)
;
else
{
for(int blkX2=0;blkX2<MBSIZE;blkX2++)
{
for(int blkY2=0;blkY2<MBSIZE;blkY2++)
{
int MAX1=0,MAX2=0;
//为了避免溢硜E!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!过了则补上边缘
MAX1 =((i+blkY2)*imgWidth+(j+blkX2)<=(imgWidth*imgHeight-1))?(i+blkY2)*imgWidth+(j+blkX2):(imgWidth*imgHeight-1);
MAX2 =(((refBlkVer+blkY2)*imgWidth+(refBlkHor+blkX2))<=(imgWidth*imgHeight-1))?((refBlkVer+blkY2)*imgWidth+(refBlkHor+blkX2)):(imgWidth*imgHeight-1);
*(imgPtmp[blkX2]+blkY2) = *(imgP+MAX1);
*(imgItmp[blkX2]+blkY2) = *(imgI+MAX2);
}
}
costs[3] = costFuncMAD(imgPtmp,imgItmp,MBSIZE);
computations = computations + 1;
}
refBlkVer = y + LDSP[6].y;
refBlkHor = x + LDSP[6].x;
if( refBlkVer < 0 || refBlkVer+MBSIZE > imgHeight || refBlkHor < 0 || refBlkHor+MBSIZE > imgWidth)
;//图像边缘之外,跳硜E
else if (refBlkHor < j-P || refBlkHor > j+P || refBlkVer < i-P || refBlkVer > i+P)
;//搜索窗口之外,跳硜E
else
{
for(int blkX2=0;blkX2<MBSIZE;blkX2++)
{
for(int blkY2=0;blkY2<MBSIZE;blkY2++)
{
int MAX1=0,MAX2=0;
//为了避免溢硜E!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!过了则补上边缘
MAX1 =((i+blkY2)*imgWidth+(j+blkX2)<=(imgWidth*imgHeight-1))?(i+blkY2)*imgWidth+(j+blkX2):(imgWidth*imgHeight-1);
MAX2 =(((refBlkVer+blkY2)*imgWidth+(refBlkHor+blkX2))<=(imgWidth*imgHeight-1))?((refBlkVer+blkY2)*imgWidth+(refBlkHor+blkX2)):(imgWidth*imgHeight-1);
*(imgPtmp[blkX2]+blkY2) = *(imgP+MAX1);
*(imgItmp[blkX2]+blkY2) = *(imgI+MAX2);
}
}
costs[6] = costFuncMAD(imgPtmp,imgItmp,MBSIZE);
computations = computations + 1;
}
refBlkVer = y + LDSP[8].y;
refBlkHor = x + LDSP[8].x;
if( refBlkVer < 0 || refBlkVer+MBSIZE > imgHeight || refBlkHor < 0 || refBlkHor+MBSIZE > imgWidth)
;//图像边缘之外,跳硜E
else if (refBlkHor < j-P || refBlkHor > j+P || refBlkVer < i-P || refBlkVer > i+P)
;//搜索窗口之外,跳硜E
else
{
for(int blkX2=0;blkX2<MBSIZE;blkX2++)
{
for(int blkY2=0;blkY2<MBSIZE;blkY2++)
{
int MAX1=0,MAX2=0;
//为了避免溢硜E!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!过了则补上边缘
MAX1 =((i+blkY2)*imgWidth+(j+blkX2)<=(imgWidth*imgHeight-1))?(i+blkY2)*imgWidth+(j+blkX2):(imgWidth*imgHeight-1);
MAX2 =(((refBlkVer+blkY2)*imgWidth+(refBlkHor+blkX2))<=(imgWidth*imgHeight-1))?((refBlkVer+blkY2)*imgWidth+(refBlkHor+blkX2)):(imgWidth*imgHeight-1);
*(imgPtmp[blkX2]+blkY2) = *(imgP+MAX1);
*(imgItmp[blkX2]+blkY2) = *(imgI+MAX2);
}
}
costs[8] = costFuncMAD(imgPtmp,imgItmp,MBSIZE);
computations = computations + 1;
}
break;
}
case '7': // three blocks 6 8 9
{
int refBlkVer,refBlkHor;
refBlkVer = y + LDSP[5].y;
refBlkHor = x + LDSP[5].x;
if ( refBlkVer < 0 || refBlkVer+MBSIZE > imgHeight|| refBlkHor < 0 || refBlkHor+MBSIZE> imgWidth)
;
else if (refBlkHor < j-P || refBlkHor > j+P || refBlkVer < i-P || refBlkVer > i+P)
;
else
{
for(int blkX2=0;blkX2<MBSIZE;blkX2++)
{
for(int blkY2=0;blkY2<MBSIZE;blkY2++)
{
int MAX1=0,MAX2=0;
//为了避免溢硜E!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!过了则补上边缘
MAX1 =((i+blkY2)*imgWidth+(j+blkX2)<=(imgWidth*imgHeight-1))?(i+blkY2)*imgWidth+(j+blkX2):(imgWidth*imgHeight-1);
MAX2 =(((refBlkVer+blkY2)*imgWidth+(refBlkHor+blkX2))<=(imgWidth*imgHeight-1))?((refBlkVer+blkY2)*imgWidth+(refBlkHor+blkX2)):(imgWidth*imgHeight-1);
*(imgPtmp[blkX2]+blkY2) = *(imgP+MAX1);
*(imgItmp[blkX2]+blkY2) = *(imgI+MAX2);
}
}
costs[5] = costFuncMAD(imgPtmp,imgItmp,MBSIZE);
computations = computations + 1;
}
refBlkVer = y + LDSP[7].y;
refBlkHor = x + LDSP[7].x;
if( refBlkVer < 0 || refBlkVer+MBSIZE > imgHeight || refBlkHor < 0 || refBlkHor+MBSIZE > imgWidth)
; //图像边缘之外,跳硜E
else if (refBlkHor < j-P || refBlkHor > j+P || refBlkVer < i-P || refBlkVer > i+P)
;//搜索窗口之外,跳硜E
else
{
for(int blkX2=0;blkX2<MBSIZE;blkX2++)
{
for(int blkY2=0;blkY2<MBSIZE;blkY2++)
{
int MAX1=0,MAX2=0;
//为了避免溢硜E!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!过了则补上边缘
MAX1 =((i+blkY2)*imgWidth+(j+blkX2)<=(imgWidth*imgHeight-1))?(i+blkY2)*imgWidth+(j+blkX2):(imgWidth*imgHeight-1);
MAX2 =(((refBlkVer+blkY2)*imgWidth+(refBlkHor+blkX2))<=(imgWidth*imgHeight-1))?((refBlkVer+blkY2)*imgWidth+(refBlkHor+blkX2)):(imgWidth*imgHeight-1);
*(imgPtmp[blkX2]+blkY2) = *(imgP+MAX1);
*(imgItmp[blkX2]+blkY2) = *(imgI+MAX2);
}
}
costs[7] = costFuncMAD(imgPtmp,imgItmp,MBSIZE);
computations = computations + 1;
}
refBlkVer = y + LDSP[8].y;
refBlkHor = x + LDSP[8].x;
if( refBlkVer < 0 || refBlkVer+MBSIZE > imgHeight || refBlkHor < 0 || refBlkHor+MBSIZE > imgWidth)
;//图像边缘之外,跳硜E
else if (refBlkHor < j-P || refBlkHor > j+P || refBlkVer < i-P || refBlkVer > i+P)
;//搜索窗口之外,跳硜E
else
{
for(int blkX2=0;blkX2<MBSIZE;blkX2++)
{
for(int blkY2=0;blkY2<MBSIZE;blkY2++)
{
int MAX1=0,MAX2=0;
//为了避免溢硜E!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!过了则补上边缘
MAX1 =((i+blkY2)*imgWidth+(j+blkX2)<=(imgWidth*imgHeight-1))?(i+blkY2)*imgWidth+(j+blkX2):(imgWidth*imgHeight-1);
MAX2 =(((refBlkVer+blkY2)*imgWidth+(refBlkHor+blkX2))<=(imgWidth*imgHeight-1))?((refBlkVer+blkY2)*imgWidth+(refBlkHor+blkX2)):(imgWidth*imgHeight-1);
*(imgPtmp[blkX2]+blkY2) = *(imgP+MAX1);
*(imgItmp[blkX2]+blkY2) = *(imgI+MAX2);
}
}
costs[8] = costFuncMAD(imgPtmp,imgItmp,MBSIZE);
computations = computations + 1;
}
break;
}
default:
{
break;
}
}//switch
}//else
//第二次调用计算LDSP运算蛠E葽@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@//
minSearch(costs,9,cost,point);
if (point[0] == 4)
SDSPFlag = 1;
else
{
SDSPFlag = 0;
if ( abs(LDSP[point[0]].x) == abs(LDSP[point[0]].y) )
cornerFlag = 0;
else
cornerFlag = 1; //角点眮E�
xLast = x;
yLast = y;
x = x + LDSP[point[0]].x;
y = y + LDSP[point[0]].y;
for(int index=0;index<9;index++)
{
costs[index]=65537;
}
costs[4] = cost[0];
}
}//while 循环结蕘E
//************************************* 进葋ESDSP 计藖E**********************************************//
costsSDSP[2]=cost[0];
for(k=0;k<5;k++)
{
int refBlkVer,refBlkHor;
refBlkVer = y + SDSP[k].y;
refBlkHor = x + SDSP[k].x;
if ( refBlkVer < 0 || refBlkVer+MBSIZE > imgHeight|| refBlkHor < 0 || refBlkHor+MBSIZE > imgWidth)
continue;
else if (refBlkHor < j-P || refBlkHor > j+P || refBlkVer < i-P || refBlkVer > i+P)
continue;
if (k == 2)
continue;
for(int blkX2=0;blkX2<MBSIZE;blkX2++)
{
for(int blkY2=0;blkY2<MBSIZE;blkY2++)
{
int MAX1=0,MAX2=0;
//为了避免溢硜E!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!过了则补上边缘
MAX1 =((i+blkY2)*imgWidth+(j+blkX2)<=(imgWidth*imgHeight-1))?(i+blkY2)*imgWidth+(j+blkX2):(imgWidth*imgHeight-1);
MAX2 =(((refBlkVer+blkY2)*imgWidth+(refBlkHor+blkX2))<=(imgWidth*imgHeight-1))?((refBlkVer+blkY2)*imgWidth+(refBlkHor+blkX2)):(imgWidth*imgHeight-1);
*(imgPtmp[blkX2]+blkY2) = *(imgP+MAX1);
*(imgItmp[blkX2]+blkY2) = *(imgI+MAX2);
}
}
costsSDSP[k] = costFuncMAD(imgPtmp,imgItmp,MBSIZE);
computations = computations + 1;
}
//第三次调用用于SDSP@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@//
minSearch(costsSDSP,5,cost,point);
x = x + SDSP[point[0]].x;
y = y + SDSP[point[0]].y;
//判断是否写溢硜E
if(mbCount>vectorsNum)
mbCount = vectorsNum;
vectors[0][mbCount-1] = y - i; // 运动矢量的行坐眮E
vectors[1][mbCount-1] = x - j; // 运动矢量的列坐眮E
//模块计数加一
mbCount = mbCount + 1;
// costs[3][3]={{65537,65537,65537},{65537,65537,65537},{65537,65537,65537}};
//将开销函数复原---有其他简单方法么?
for(k=0;k<5;k++)
{
costsSDSP[k]=65537;
}
//还原costs值
for(k=0;k<9;k++)
{
costs[k]=65537;
}
//释放内磥E
for (k=0;k<MBSIZE;k++)
delete []imgPtmp[k];
for (k=0;k<MBSIZE;k++)
delete []imgItmp[k];
delete []imgPtmp;
delete []imgItmp;
}
}
for(i=0;i<2;i++)
{
for(j=0;j<MAX;j++)
{
if(j>=vectorsNum)
motionVect[i][j]=0;
else
motionVect[i][j]=vectors[i][j];
}
}
*DScomputations = computations/(mbCount - 1);
}