GrabBag/Module/ChessboardDetector/Inc/IChessboardDetector.h
2026-02-18 15:11:41 +08:00

163 lines
4.6 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef ICHESSBOARDDETECTOR_H
#define ICHESSBOARDDETECTOR_H
#include <vector>
/**
* @brief 2D 点结构
*/
struct Point2D
{
double x;
double y;
Point2D() : x(0.0), y(0.0) {}
Point2D(double _x, double _y) : x(_x), y(_y) {}
};
/**
* @brief 3D 点结构
*/
struct Point3D
{
double x;
double y;
double z;
Point3D() : x(0.0), y(0.0), z(0.0) {}
Point3D(double _x, double _y, double _z) : x(_x), y(_y), z(_z) {}
};
/**
* @brief 标定板检测结果
*/
struct ChessboardDetectResult
{
bool detected; // 是否检测到标定板
std::vector<Point2D> corners; // 角点坐标(图像坐标系)
int patternWidth; // 标定板内角点宽度
int patternHeight; // 标定板内角点高度
// 位姿信息(如果提供了相机内参)
bool hasPose; // 是否计算了位姿
Point3D center; // 标定板中心位置相机坐标系单位mm
Point3D normal; // 标定板法向量(单位向量)
double rvec[3]; // 旋转向量
double tvec[3]; // 平移向量
double rotationMatrix[9]; // 旋转矩阵 (3x3)
double eulerAngles[3]; // 欧拉角 (roll, pitch, yaw) 单位:度
ChessboardDetectResult()
: detected(false)
, patternWidth(0)
, patternHeight(0)
, hasPose(false)
{
for (int i = 0; i < 3; i++) {
rvec[i] = 0.0;
tvec[i] = 0.0;
eulerAngles[i] = 0.0;
}
for (int i = 0; i < 9; i++) {
rotationMatrix[i] = 0.0;
}
}
};
/**
* @brief 相机内参
*/
struct CameraIntrinsics
{
double fx; // 焦距 x
double fy; // 焦距 y
double cx; // 主点 x
double cy; // 主点 y
double k1, k2, p1, p2, k3; // 畸变系数
CameraIntrinsics()
: fx(1000.0), fy(1000.0)
, cx(640.0), cy(480.0)
, k1(0.0), k2(0.0), p1(0.0), p2(0.0), k3(0.0)
{}
};
/**
* @brief 标定板检测接口
*/
class IChessboardDetector
{
public:
virtual ~IChessboardDetector() = default;
/**
* @brief 检测标定板角点
* @param imageData 图像数据(灰度图或彩色图)
* @param width 图像宽度
* @param height 图像高度
* @param channels 图像通道数 (1=灰度, 3=BGR)
* @param patternWidth 标定板内角点宽度
* @param patternHeight 标定板内角点高度
* @param result 输出检测结果
* @return 成功返回0失败返回错误码
*/
virtual int DetectChessboard(
const unsigned char* imageData,
int width,
int height,
int channels,
int patternWidth,
int patternHeight,
ChessboardDetectResult& result) = 0;
/**
* @brief 检测标定板并计算位姿
* @param imageData 图像数据
* @param width 图像宽度
* @param height 图像高度
* @param channels 图像通道数
* @param patternWidth 标定板内角点宽度
* @param patternHeight 标定板内角点高度
* @param squareSize 标定板格子大小单位mm
* @param intrinsics 相机内参
* @param result 输出检测结果(包含位姿)
* @return 成功返回0失败返回错误码
*/
virtual int DetectChessboardWithPose(
const unsigned char* imageData,
int width,
int height,
int channels,
int patternWidth,
int patternHeight,
double squareSize,
const CameraIntrinsics& intrinsics,
ChessboardDetectResult& result) = 0;
/**
* @brief 设置检测参数
* @param adaptiveThresh 是否使用自适应阈值
* @param normalizeImage 是否归一化图像
* @param filterQuads 是否过滤四边形
* @return 成功返回0
*/
virtual int SetDetectionFlags(
bool adaptiveThresh,
bool normalizeImage,
bool filterQuads) = 0;
};
/**
* @brief 创建标定板检测实例
* @return 标定板检测实例指针
*/
IChessboardDetector* CreateChessboardDetectorInstance();
/**
* @brief 销毁标定板检测实例
* @param instance 实例指针
*/
void DestroyChessboardDetectorInstance(IChessboardDetector* instance);
#endif // ICHESSBOARDDETECTOR_H