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 *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);

View File

@ -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;

View File

@ -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>

View File

@ -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;
}