camCalib/camCalib
version 1.1.0 : 修正了单目相机标定时生成激光面方程的bug
This commit is contained in:
parent
1127ec7b25
commit
91863b5fc6
@ -113,7 +113,8 @@ void SvPickRgnRslt(
|
||||
char * BmpDstFileName
|
||||
)
|
||||
{
|
||||
char *TXTData = (char *)malloc(256);
|
||||
//char *TXTData = (char *)malloc(256);
|
||||
char TXTData[256];
|
||||
memset(TXTData,0,256);
|
||||
|
||||
std::ofstream TXTFile(TxtDstFileName);
|
||||
@ -207,7 +208,7 @@ void SvPickRgnRslt(
|
||||
}
|
||||
|
||||
TXTFile.close();
|
||||
free(TXTData);
|
||||
//free(TXTData);
|
||||
|
||||
unsigned char *DstR = (unsigned char *)malloc(FrmH*FrmW);
|
||||
unsigned char *DstG = (unsigned char *)malloc(FrmH*FrmW);
|
||||
|
||||
@ -101,8 +101,10 @@ int main(int argc, char** argv)
|
||||
|
||||
ProcObjInst[Grp_idx].SrcFileDir = (char*)malloc(FILENAME_LEN);
|
||||
ProcObjInst[Grp_idx].DstFileDir = (char*)malloc(FILENAME_LEN);
|
||||
sprintf(ProcObjInst[Grp_idx].SrcFileDir, "D:/LicgWork/ToExt/PickLazerWin/TstSrc/Grp_0/");
|
||||
sprintf(ProcObjInst[Grp_idx].DstFileDir, "D:/LicgWork/ToExt/PickLazerWin/SimRslt/Grp_0/");
|
||||
//sprintf(ProcObjInst[Grp_idx].SrcFileDir, "D:/LicgWork/ToExt/PickLazerWin/TstSrc/Grp_0/");
|
||||
//sprintf(ProcObjInst[Grp_idx].DstFileDir, "D:/LicgWork/ToExt/PickLazerWin/SimRslt/Grp_0/");
|
||||
sprintf(ProcObjInst[Grp_idx].SrcFileDir, "F:/Licg/CModelPrj/SimCaseSet/TstSrc/Grp_0/");
|
||||
sprintf(ProcObjInst[Grp_idx].DstFileDir, "F:/Licg/CModelPrj/SimCaseSet/SimRslt/Grp_0/");
|
||||
|
||||
|
||||
int ret = 0;
|
||||
|
||||
@ -124,7 +124,7 @@
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalLibraryDirectories>F:\ShangGu\ProductDev\AlgoDev\thirdParty\opencv\build\x64\vc16\lib;..\build\x64\Debug;.\sourceCode\CG_frontEnd\lib\debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<AdditionalLibraryDirectories>..\build\x64\Debug;.\sourceCode\CG_frontEnd\lib\debug;D:\zeng\AlgoDev\thirdParty\opencv320\build\include;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<AdditionalDependencies>opencv_world480d.lib;camAlgoSW.lib;ImgAccd.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
@ -143,7 +143,7 @@
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalLibraryDirectories>F:\ShangGu\ProductDev\AlgoDev\thirdParty\opencv\build\x64\vc16\lib;..\build\x64\Release;F:\ShangGu\ProductDev\三角光相机\相机开发\camAlgo_git\camAlgoSW\sourceCode\CG_frontEnd\lib\debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<AdditionalLibraryDirectories>..\build\x64\Release;F:\ShangGu\ProductDev\三角光相机\相机开发\camAlgo_git\camAlgoSW\sourceCode\CG_frontEnd\lib\debug;D:\zeng\AlgoDev\thirdParty\opencv320\build\include;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<AdditionalDependencies>opencv_world480.lib;camAlgoSW.lib;ImgAccd.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
|
||||
@ -11,7 +11,8 @@
|
||||
#define _DO_CAMERA_CALIB 1
|
||||
|
||||
//version 1.0.0 : base version released
|
||||
std::string m_strVersion = "camCalib 1.0.0";
|
||||
//version 1.1.0 : 修正了单目相机标定时生成激光面方程的bug
|
||||
std::string m_strVersion = "camCalib 1.1.0";
|
||||
const char* wd_camCalibVersion(void)
|
||||
{
|
||||
return m_strVersion.c_str();
|
||||
@ -58,6 +59,7 @@ void sg_outputCalibKD(const char* fileName, cv::Mat& K, cv::Mat& D, cv::Vec4f& p
|
||||
sprintf_s(dataStr, 250, "%g, %g, %g, %g, %g", temp[0], temp[1], temp[2], temp[3], temp[4]);
|
||||
sw << dataStr << std::endl;
|
||||
|
||||
#if 0
|
||||
//ax+by+cz+d = 0
|
||||
float a = (float)pe[0];
|
||||
float b = (float)pe[1];
|
||||
@ -69,6 +71,14 @@ void sg_outputCalibKD(const char* fileName, cv::Mat& K, cv::Mat& D, cv::Vec4f& p
|
||||
d = -d / c;
|
||||
c = -1;
|
||||
sprintf_s(dataStr, 250, "%g, %g, %g", a, b, d);
|
||||
#else
|
||||
// 1/z = ax+by+c
|
||||
float a = (float)pe[0];
|
||||
float b = (float)pe[1];
|
||||
float c = (float)pe[2];
|
||||
sprintf_s(dataStr, 250, "%g, %g, %g", a, b, c);
|
||||
#endif
|
||||
|
||||
sw << dataStr << std::endl;
|
||||
|
||||
sw.close();
|
||||
@ -225,7 +235,7 @@ void lineFitting_abc(std::vector< cv::Point2f>& inliers, double* _a, double* _b,
|
||||
}
|
||||
|
||||
|
||||
#define MONO_CALIB_TEST_GROUP 5
|
||||
#define MONO_CALIB_TEST_GROUP 6
|
||||
int MonoCamLaserCalib()
|
||||
{
|
||||
std::cout << "Hello World!\n";
|
||||
@ -236,9 +246,12 @@ int MonoCamLaserCalib()
|
||||
"F:\\ShangGu\\ProductDev\\三角光相机\\相机开发\\CamAlgo_git\\camCalib\\camCalibData\\circlePoint\\", //2
|
||||
"F:\\ShangGu\\ProductDev\\三角光相机\\相机开发\\CamAlgo_git\\camCalib\\camCalibData\\charuCo\\", //3
|
||||
"F:/ShangGu/单目相机标定数据/TestData/", //4
|
||||
"F:/ShangGu/单目相机标定数据/5_3mm_lens/", //5
|
||||
|
||||
};
|
||||
const SWdNLRange fileIdx[MONO_CALIB_TEST_GROUP] = {
|
||||
{3,39},{6,33},{1,33},{1,10},{1,26}
|
||||
{3,39},{6,33},{1,33},{1,10},{1,26},
|
||||
{1,23}
|
||||
};
|
||||
const int boardType[MONO_CALIB_TEST_GROUP] =
|
||||
{
|
||||
@ -247,9 +260,10 @@ int MonoCamLaserCalib()
|
||||
CALIB_CIRCLE_GRID,
|
||||
CALIB_CHARUCO,
|
||||
CALIB_CHARUCO,
|
||||
CALIB_CHARUCO,
|
||||
};
|
||||
|
||||
for(int grp = 4; grp <= 4; grp ++)
|
||||
for(int grp = 5; grp <= 5; grp ++)
|
||||
{
|
||||
//grp = 1;
|
||||
int calibType = boardType[grp];
|
||||
@ -574,10 +588,10 @@ int MonoCamLaserCalib()
|
||||
roi_T = roi_T > corners[i].y ? corners[i].y : roi_T;
|
||||
roi_B = roi_B < corners[i].y ? corners[i].y : roi_B;
|
||||
}
|
||||
int left = (int)roi_L;
|
||||
int left = (int)roi_L - 100;
|
||||
if (left < 0)
|
||||
left = 0;
|
||||
int right = (int)roi_R;
|
||||
int right = (int)roi_R + 100;
|
||||
if (right >= chessMask.cols)
|
||||
right = chessMask.cols - 1;
|
||||
int top = (int)roi_T - 100;
|
||||
@ -776,10 +790,28 @@ int MonoCamLaserCalib()
|
||||
cv::Vec4f laser_pe = fitPlaneToPoints(all_pts3d);
|
||||
std::cout << "pe: " << laser_pe << std::endl;
|
||||
|
||||
//转成以像素为坐标的方程
|
||||
//ax+by+cz+d=0 形式
|
||||
float a = (float)laser_pe[0];
|
||||
float b = (float)laser_pe[1];
|
||||
float c = (float)laser_pe[2];
|
||||
float d = (float)laser_pe[3];
|
||||
//
|
||||
double f = K.at<double>(0, 0); // 第0行第0列
|
||||
double cx = K.at<double>(0, 2); // 第0行第2列
|
||||
double cy = K.at<double>(1, 2); // 第1行第2列
|
||||
|
||||
cv::Vec4f laser_pe_UV;
|
||||
double mul_df = d * f;
|
||||
laser_pe_UV[0] = -a / mul_df;
|
||||
laser_pe_UV[1] = -b / mul_df;
|
||||
laser_pe_UV[2] = (a * cx + b * cy) / mul_df - c / d;
|
||||
laser_pe_UV[3] = 0;
|
||||
|
||||
//output K and D
|
||||
char calibKDPName[256];
|
||||
sprintf_s(calibKDPName, "%sresult/calib_param_K_D.txt", calibDataPath[grp]);
|
||||
sg_outputCalibKD(calibKDPName, K, D, laser_pe);
|
||||
sg_outputCalibKD(calibKDPName, K, D, laser_pe_UV);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user