diff --git a/camAlgoSW/sourceCode/CG_frontEnd/Demo/ImgUtils.cpp b/camAlgoSW/sourceCode/CG_frontEnd/Demo/ImgUtils.cpp index c4349dd..a91104c 100644 --- a/camAlgoSW/sourceCode/CG_frontEnd/Demo/ImgUtils.cpp +++ b/camAlgoSW/sourceCode/CG_frontEnd/Demo/ImgUtils.cpp @@ -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); diff --git a/camAlgoSW/sourceCode/CG_frontEnd/Demo/main.cpp b/camAlgoSW/sourceCode/CG_frontEnd/Demo/main.cpp index 8e675a8..524091f 100644 --- a/camAlgoSW/sourceCode/CG_frontEnd/Demo/main.cpp +++ b/camAlgoSW/sourceCode/CG_frontEnd/Demo/main.cpp @@ -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; diff --git a/camAlgoSW_test/camAlgoSW_test.vcxproj b/camAlgoSW_test/camAlgoSW_test.vcxproj index cbec48f..cf46f37 100644 --- a/camAlgoSW_test/camAlgoSW_test.vcxproj +++ b/camAlgoSW_test/camAlgoSW_test.vcxproj @@ -124,7 +124,7 @@ Console true - F:\ShangGu\ProductDev\AlgoDev\thirdParty\opencv\build\x64\vc16\lib;..\build\x64\Debug;.\sourceCode\CG_frontEnd\lib\debug;%(AdditionalLibraryDirectories) + ..\build\x64\Debug;.\sourceCode\CG_frontEnd\lib\debug;D:\zeng\AlgoDev\thirdParty\opencv320\build\include;%(AdditionalLibraryDirectories) 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) @@ -143,7 +143,7 @@ true true true - 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) + ..\build\x64\Release;F:\ShangGu\ProductDev\三角光相机\相机开发\camAlgo_git\camAlgoSW\sourceCode\CG_frontEnd\lib\debug;D:\zeng\AlgoDev\thirdParty\opencv320\build\include;%(AdditionalLibraryDirectories) 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) diff --git a/camCalib/camCalib.cpp b/camCalib/camCalib.cpp index 680125d..625bd79 100644 --- a/camCalib/camCalib.cpp +++ b/camCalib/camCalib.cpp @@ -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(0, 0); // 第0行第0列 + double cx = K.at(0, 2); // 第0行第2列 + double cy = K.at(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; }