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
|
void WorkerBunny::EstimateTransformation()
{
vector<Point2f> Model_Points, Image_Points, Inlier_Model_Points, Inlier_Image_Points;
vector<Point3f> Model_Points3d, Image_Points3d;
vector<uchar> Inlier_Points;
Mat tform, Mask, Mask2, tform_tmp(2, 2, CV_64F), tform2(3, 4, CV_64F);
vector<int> NumberInlierPoint;
for (int k = 0; k < vect_Matched_Model_keypoints.size(); k++)
{
// pour chaque modeles possible
//PROCESS_MEMORY_COUNTERS pmc;
//GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc));
//SIZE_T virtualMemUsedByPRocess_begin = pmc.PagefileUsage;
Model_Points.clear();
Image_Points.clear();
Inlier_Model_Points.clear();
Inlier_Image_Points.clear();
Model_Points.shrink_to_fit();
Image_Points.shrink_to_fit();
Inlier_Model_Points.shrink_to_fit();
Inlier_Image_Points.shrink_to_fit();
// mise en forme des données
for (int j = 0; j < vect_Matched_Model_keypoints.at(k).vect_Model_KeyPoint.size(); j++)
{
Model_Points.push_back(vect_Matched_Model_keypoints.at(k).vect_Model_KeyPoint.at(j).pt);
Image_Points.push_back(vect_Matched_Model_keypoints.at(k).vect_Image_KeyPoint.at(j).pt);
}
//GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc));
//SIZE_T virtualMemUsedByPRocess_end1 = pmc.PagefileUsage;
//long int diff1 = virtualMemUsedByPRocess_end1 - virtualMemUsedByPRocess_begin;
//long double ko1 = diff1 / 1024;
float ratio = ((float)params->InlierImagePointSeuil - 1) / Model_Points.size();
int* Good_Match_idx = (int*)malloc(Model_Points.size()*sizeof(int));
//GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc));
//SIZE_T virtualMemUsedByPRocess_end2 = pmc.PagefileUsage;
//long int diff2 = virtualMemUsedByPRocess_end2 - virtualMemUsedByPRocess_begin;
//long double ko2 = diff2 / 1024;
// estomation de la transformation
tform = estimateRigidTransform_custom(Model_Points, Image_Points, false, MAX(2000, MIN(Model_Points.size() * 2, 10000)), 3, ratio, Good_Match_idx, params->ReprojectionThreshold);
//GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc));
//SIZE_T virtualMemUsedByPRocess_end3 = pmc.PagefileUsage;
//long int diff3 = virtualMemUsedByPRocess_end3 - virtualMemUsedByPRocess_begin;
//long double ko3 = diff3 / 1024;
// Transform_Struct result = estimateRigidTransform_own(Model_Points, Image_Points, 2000, params->ReprojectionThreshold, 3, 0.70);
// tform = result.tform;
// for (int i = 0; i < result.Matchok.size();i++)Good_Match_idx[i] = result.Matchok.at(i);
//tform = findHomography_custom();
// Validation de la transformation
if (!tform.empty())
{
//GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc));
//SIZE_T virtualMemUsedByPRocess_tformempty = pmc.PagefileUsage;
double* ptr0 = tform_tmp.ptr<double>(0);
double* ptr1 = tform_tmp.ptr<double>(1);
double val = tform.at<double>(0, 0);;
ptr0[0] = tform.at<double>(0, 0);
ptr0[1] = tform.at<double>(0, 1);
ptr1[0] = tform.at<double>(1, 0);
ptr1[1] = tform.at<double>(1, 1);
int sum = 0;
for (int j = 0; j < Model_Points.size(); j++)
{
if (Good_Match_idx[j])
{
Inlier_Model_Points.push_back(Model_Points.at(j));
Inlier_Image_Points.push_back(Image_Points.at(j));
sum++;
}
}
NumberInlierPoint.push_back(sum);
free(Good_Match_idx);
//GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc));
//SIZE_T virtualMemUsedByPRocess_end4 = pmc.PagefileUsage;
//long int diff4 = virtualMemUsedByPRocess_end4 - virtualMemUsedByPRocess_begin;
//long double ko4 = diff4 / 1024;
//cout << "k = " << k << " ko4 = " << ko4 << endl;
int Nb_unique_inlier = 0;
for (int j = 0; j < Inlier_Image_Points.size(); j++)
{
for (int i = j; i < Inlier_Image_Points.size(); i++)
{
bool x = (Inlier_Image_Points.at(j).x == Inlier_Image_Points.at(i).x);
bool y = (Inlier_Image_Points.at(j).y == Inlier_Image_Points.at(i).y);
if (x && y)
{
Inlier_Image_Points.erase(Inlier_Image_Points.begin() + j);
}
}
}
//GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc));
//SIZE_T virtualMemUsedByPRocess_end5 = pmc.PagefileUsage;
//long int diff5 = virtualMemUsedByPRocess_end5 - virtualMemUsedByPRocess_begin;
//long double ko5 = diff5 / 1024;
float n = norm(tform_tmp, NORM_L2);
if (n < params->TransformSeuil && n > 1 / params->TransformSeuil && Inlier_Image_Points.size() > params->InlierImagePointSeuil && Inlier_Model_Points.size() > params->InlierModelPointSeuil)
{
// si transformation ok on stop
TransformationStruct.Model_Found = vect_Matched_Model_keypoints.at(k).Name;
TransformationStruct.NbMatchingPoints = vect_Matched_Model_keypoints.at(k).vect_Model_KeyPoint.size();
TransformationStruct.NbInlierPoints = Inlier_Image_Points.size();
TransformationStruct.norm = n;
Model_Points.clear(); Image_Points.clear();
Inlier_Model_Points.clear(); Inlier_Image_Points.clear();
Model_Points3d.clear(), Image_Points3d.clear();
Inlier_Points.clear();
Model_Points.shrink_to_fit(); Image_Points.shrink_to_fit();
Inlier_Model_Points.shrink_to_fit(); Inlier_Image_Points.shrink_to_fit();
Model_Points3d.shrink_to_fit(), Image_Points3d.shrink_to_fit();
Inlier_Points.shrink_to_fit();
tform.release(); Mask.release(); Mask2.release(); tform_tmp.release(); tform2.release();
NumberInlierPoint.clear();
NumberInlierPoint.shrink_to_fit();
//GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc));
//SIZE_T virtualMemUsedByPRocess_end6 = pmc.PagefileUsage;
//long int diff6 = virtualMemUsedByPRocess_end6 - virtualMemUsedByPRocess_begin;
//long double ko6 = diff6 / 1024;
//cout << "k = " << k << " ko6 = " << ko6 << endl;
//GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc));
//SIZE_T virtualMemUsedByPRocess_tformempty_end = pmc.PagefileUsage;
//long int diff7 = virtualMemUsedByPRocess_tformempty_end - virtualMemUsedByPRocess_tformempty;
//long double ko7 = diff7 / 1024;
//cout << "inside if k = " << k << " ko7_ok = " << ko7 << endl;
return;// Transformation_Struct;
}
//GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc));
//SIZE_T virtualMemUsedByPRocess_tformempty_end = pmc.PagefileUsage;
//long int diff7 = virtualMemUsedByPRocess_tformempty_end - virtualMemUsedByPRocess_tformempty;
//long double ko7 = diff7 / 1024;
//cout << "inside if k = " << k << " ko7 = " << ko7 << endl;
}
tform.release();
//GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc));
//SIZE_T virtualMemUsedByPRocess_end6 = pmc.PagefileUsage;
//long int diff6 = virtualMemUsedByPRocess_end6 - virtualMemUsedByPRocess_begin;
//long double ko6 = diff6 / 1024;
//cout << "k = " << k << " ko6 = " << ko6 << endl;
}
TransformationStruct.Model_Found = "";
TransformationStruct.NbInlierPoints = -1;
TransformationStruct.NbMatchingPoints = -1;
TransformationStruct.norm = -1;
TransformationStruct.tform = NULL;
Model_Points.clear(); Image_Points.clear();
Inlier_Model_Points.clear(); Inlier_Image_Points.clear();
Model_Points3d.clear(), Image_Points3d.clear();
Inlier_Points.clear();
Model_Points.shrink_to_fit(); Image_Points.shrink_to_fit();
Inlier_Model_Points.shrink_to_fit(); Inlier_Image_Points.shrink_to_fit();
Model_Points3d.shrink_to_fit(), Image_Points3d.shrink_to_fit();
Inlier_Points.shrink_to_fit();
tform.release(); Mask.release(); Mask2.release(); tform_tmp.release(); tform2.release();
NumberInlierPoint.clear();
NumberInlierPoint.shrink_to_fit();
return;// Transformation_Struct;
} |
Partager