# cv::error: (-215:断言失败) npoints >= 0 && npoints == std::max(1, (int)objectPoints.size()) 在函数 'cv::fisheye::estimateExtrinsics' 中

- **ID:** `opencv/calib3d-fisheye-estimate-extrinsics-invalid`
- **领域:** opencv
- **类别:** assertion_error
- **验证级别:** ai_generated
- **修复率:** 86%

## 根因

传递给 fisheye::estimateExtrinsics 的图像点数 (npoints) 与物点数不匹配，或者 objectPoints 向量为空。

## 版本兼容性

| 版本 | 状态 | 引入 | 弃用 |
|------|------|------|------|
| opencv-4.5.5 | active | — | — |
| opencv-4.8.0 | active | — | — |
| opencv-4.9.0 | active | — | — |

## 解决方案

1. ```
   Ensure imagePoints and objectPoints have the same size: assert(imagePoints.size() == objectPoints.size()); Then call: cv::fisheye::estimateExtrinsics(objectPoints, imagePoints, K, D, rvec, tvec);
   ```
2. ```
   If using a chessboard, use cv::findChessboardCorners to get imagePoints and generate objectPoints with cv::fisheye::calcChessboardCorners. Example: std::vector<cv::Point3f> objp; cv::fisheye::calcChessboardCorners(cv::Size(9,6), 1.0f, objp); Then match sizes.
   ```
3. ```
   Debug by printing sizes before the call: std::cout << 'obj size: ' << objectPoints.size() << ' img size: ' << imagePoints.size() << std::endl; If they differ, pad or trim the larger vector to match.
   ```

## 无效尝试

- **Use cv::fisheye::calibrate instead of estimateExtrinsics** — calibrate is for full calibration, not for single-view extrinsic estimation. It requires multiple views and returns different outputs. (85% 失败率)
- **Set npoints to a large constant like 100** — npoints must be exactly the size of the imagePoints vector. A hardcoded value will always mismatch unless coincidentally correct. (95% 失败率)
- **Convert objectPoints to a vector of cv::Point3f instead of cv::Point3d** — The assertion checks size, not type. Type mismatch causes a different error, but size mismatch persists. (70% 失败率)
