camCalib/camCalib

version 1.1.0 : 修正了单目相机标定时生成激光面方程的bug
This commit is contained in:
jerryzeng 2026-08-31 10:43:28 +08:00
parent 1127ec7b25
commit 91863b5fc6
4 changed files with 48 additions and 13 deletions

View File

@ -113,7 +113,8 @@ void SvPickRgnRslt(
char * BmpDstFileName char * BmpDstFileName
) )
{ {
char *TXTData = (char *)malloc(256); //char *TXTData = (char *)malloc(256);
char TXTData[256];
memset(TXTData,0,256); memset(TXTData,0,256);
std::ofstream TXTFile(TxtDstFileName); std::ofstream TXTFile(TxtDstFileName);
@ -207,7 +208,7 @@ void SvPickRgnRslt(
} }
TXTFile.close(); TXTFile.close();
free(TXTData); //free(TXTData);
unsigned char *DstR = (unsigned char *)malloc(FrmH*FrmW); unsigned char *DstR = (unsigned char *)malloc(FrmH*FrmW);
unsigned char *DstG = (unsigned char *)malloc(FrmH*FrmW); unsigned char *DstG = (unsigned char *)malloc(FrmH*FrmW);

View File

@ -101,8 +101,10 @@ int main(int argc, char** argv)
ProcObjInst[Grp_idx].SrcFileDir = (char*)malloc(FILENAME_LEN); ProcObjInst[Grp_idx].SrcFileDir = (char*)malloc(FILENAME_LEN);
ProcObjInst[Grp_idx].DstFileDir = (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].SrcFileDir, "D:/LicgWork/ToExt/PickLazerWin/TstSrc/Grp_0/");
sprintf(ProcObjInst[Grp_idx].DstFileDir, "D:/LicgWork/ToExt/PickLazerWin/SimRslt/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; int ret = 0;

View File

@ -124,7 +124,7 @@
<Link> <Link>
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation> <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> <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> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
@ -143,7 +143,7 @@
<EnableCOMDATFolding>true</EnableCOMDATFolding> <EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences> <OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation> <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> <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> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>

View File

@ -11,7 +11,8 @@
#define _DO_CAMERA_CALIB 1 #define _DO_CAMERA_CALIB 1
//version 1.0.0 : base version released //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) const char* wd_camCalibVersion(void)
{ {
return m_strVersion.c_str(); 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]); sprintf_s(dataStr, 250, "%g, %g, %g, %g, %g", temp[0], temp[1], temp[2], temp[3], temp[4]);
sw << dataStr << std::endl; sw << dataStr << std::endl;
#if 0
//ax+by+cz+d = 0 //ax+by+cz+d = 0
float a = (float)pe[0]; float a = (float)pe[0];
float b = (float)pe[1]; 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; d = -d / c;
c = -1; c = -1;
sprintf_s(dataStr, 250, "%g, %g, %g", a, b, d); 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 << dataStr << std::endl;
sw.close(); 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() int MonoCamLaserCalib()
{ {
std::cout << "Hello World!\n"; 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\\circlePoint\\", //2
"F:\\ShangGu\\ProductDev\\三角光相机\\相机开发\\CamAlgo_git\\camCalib\\camCalibData\\charuCo\\", //3 "F:\\ShangGu\\ProductDev\\三角光相机\\相机开发\\CamAlgo_git\\camCalib\\camCalibData\\charuCo\\", //3
"F:/ShangGu/单目相机标定数据/TestData/", //4 "F:/ShangGu/单目相机标定数据/TestData/", //4
"F:/ShangGu/单目相机标定数据/5_3mm_lens/", //5
}; };
const SWdNLRange fileIdx[MONO_CALIB_TEST_GROUP] = { 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] = const int boardType[MONO_CALIB_TEST_GROUP] =
{ {
@ -247,9 +260,10 @@ int MonoCamLaserCalib()
CALIB_CIRCLE_GRID, CALIB_CIRCLE_GRID,
CALIB_CHARUCO, CALIB_CHARUCO,
CALIB_CHARUCO, CALIB_CHARUCO,
CALIB_CHARUCO,
}; };
for(int grp = 4; grp <= 4; grp ++) for(int grp = 5; grp <= 5; grp ++)
{ {
//grp = 1; //grp = 1;
int calibType = boardType[grp]; int calibType = boardType[grp];
@ -574,10 +588,10 @@ int MonoCamLaserCalib()
roi_T = roi_T > corners[i].y ? corners[i].y : roi_T; roi_T = roi_T > corners[i].y ? corners[i].y : roi_T;
roi_B = roi_B < corners[i].y ? corners[i].y : roi_B; 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) if (left < 0)
left = 0; left = 0;
int right = (int)roi_R; int right = (int)roi_R + 100;
if (right >= chessMask.cols) if (right >= chessMask.cols)
right = chessMask.cols - 1; right = chessMask.cols - 1;
int top = (int)roi_T - 100; int top = (int)roi_T - 100;
@ -776,10 +790,28 @@ int MonoCamLaserCalib()
cv::Vec4f laser_pe = fitPlaneToPoints(all_pts3d); cv::Vec4f laser_pe = fitPlaneToPoints(all_pts3d);
std::cout << "pe: " << laser_pe << std::endl; 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 //output K and D
char calibKDPName[256]; char calibKDPName[256];
sprintf_s(calibKDPName, "%sresult/calib_param_K_D.txt", calibDataPath[grp]); 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; return 0;
} }