BinocularMarkCam ver 1.1.0

修改了对Mark的识别。mark生产时没有完全按照等间距格式生产。算法中做了特殊处理。
This commit is contained in:
jerryzeng 2025-12-21 10:55:11 +08:00
parent 0747a9ae2e
commit 007ce93dbf
2 changed files with 20 additions and 9 deletions

View File

@ -12,22 +12,22 @@
#include <opencv2/imgcodecs/imgcodecs.hpp> #include <opencv2/imgcodecs/imgcodecs.hpp>
#include <Windows.h> #include <Windows.h>
#define TEST_GROUP 2 #define TEST_GROUP 3
int main(int argc, char** argv) int main(int argc, char** argv)
{ {
const char* dataPath[TEST_GROUP] = { const char* dataPath[TEST_GROUP] = {
"F:/标定采图/charucoMark图/MarkTest/", //0 "F:/标定采图/charucoMark图/MarkTest/", //0
"F:/标定采图/charucoMark图/Mark_13度/", "F:/标定采图/charucoMark图/Mark_13度/",
}; "F:/ShangGu/项目/冠钦_博清科技/组装/数据/mark测试/" };
SVzNLRange fileIdx[TEST_GROUP] = { SVzNLRange fileIdx[TEST_GROUP] = {
{1,4}, {1,5}, {1,4}, {1,5}, {1,9}
}; };
const char* ver = wd_charuco3DMarkVersion(); const char* ver = wd_charuco3DMarkVersion();
printf("ver:%s\n", ver); printf("ver:%s\n", ver);
for (int grp = 1; grp < 2; grp++) for (int grp = 2; grp < 3; grp++)
{ {
SWD_BQ_CharucoMarkInfo markInfo; SWD_BQ_CharucoMarkInfo markInfo;
markInfo.patternSize = cv::Size(3, 3); markInfo.patternSize = cv::Size(3, 3);
@ -43,7 +43,7 @@ int main(int argc, char** argv)
// 1. 打开 XML 文件READ 模式) // 1. 打开 XML 文件READ 模式)
char calibFile[250]; char calibFile[250];
sprintf_s(calibFile, sizeof(calibFile), "%sStereoCamera.xml", dataPath[grp]); sprintf_s(calibFile, sizeof(calibFile), "%sStereoCamera.xml", dataPath[grp]);
cv::FileStorage fs("F:/标定采图/charucoMark图/Mark_13度/StereoCamera.xml", cv::FileStorage::READ); cv::FileStorage fs(calibFile, cv::FileStorage::READ);
// 检查文件是否成功打开 // 检查文件是否成功打开
if (!fs.isOpened()) { if (!fs.isOpened()) {
@ -68,13 +68,13 @@ int main(int argc, char** argv)
int fidx1 = fileIdx[grp].nMin; int fidx1 = fileIdx[grp].nMin;
int fidx2 = fileIdx[grp].nMax; int fidx2 = fileIdx[grp].nMax;
for (int index = fidx1; index < fidx2; index ++) for (int index = fidx1; index <= fidx2; index ++)
{ {
char filename[256]; char filename[256];
sprintf_s(filename, "%s/left%d.bmp", dataPath[grp], index); sprintf_s(filename, "%s/left_%d.bmp", dataPath[grp], index);
cv::Mat leftimg = cv::imread(filename, cv::IMREAD_GRAYSCALE); cv::Mat leftimg = cv::imread(filename, cv::IMREAD_GRAYSCALE);
sprintf_s(filename, "%s/right%d.bmp", dataPath[grp], index); sprintf_s(filename, "%s/right_%d.bmp", dataPath[grp], index);
cv::Mat rightimg = cv::imread(filename, cv::IMREAD_GRAYSCALE); cv::Mat rightimg = cv::imread(filename, cv::IMREAD_GRAYSCALE);
if (leftimg.empty() || rightimg.empty()) if (leftimg.empty() || rightimg.empty())
@ -88,6 +88,12 @@ int main(int argc, char** argv)
markInfo, boardInfo, markInfo, boardInfo,
disparityOffset, disparityOffset,
marks); marks);
printf("%s:\n", filename);
for (int i = 0; i < marks.size(); i++)
{
printf("markID:%d : (%f, %f, %f)\n", marks[i].markID, marks[i].mark3D.x, marks[i].mark3D.y, marks[i].mark3D.z);
}
} }
} }
} }

View File

@ -10,7 +10,8 @@
#define _OUTPUT_DEBUG_DATA 0 #define _OUTPUT_DEBUG_DATA 0
//version 1.0.0 : 初始版本 //version 1.0.0 : 初始版本
std::string m_strVersion = "1.0.0"; //version 1.1.0 : 修正了9个Mark生产时没有按照固定开始ID的问题
std::string m_strVersion = "1.1.0";
//读版本号 //读版本号
const char* wd_charuco3DMarkVersion(void) const char* wd_charuco3DMarkVersion(void)
{ {
@ -58,6 +59,10 @@ void detectCharucoCorners(const cv::Mat& img,
for (int board = 0; board < boardInfo.totalBoardNum; board++) for (int board = 0; board < boardInfo.totalBoardNum; board++)
{ {
int startId = board * boardInfo.boardIdInterval; int startId = board * boardInfo.boardIdInterval;
if (startId == 24)
startId = 25;
else if (startId == 8)
startId = 9;
int endId = startId + boardInfo.boardChaucoIDNum - 1; int endId = startId + boardInfo.boardChaucoIDNum - 1;
std::vector<int> ids; std::vector<int> ids;