|
发表于 2024-12-15 12:18:31
|
显示全部楼层
出现 `Mat(*this, roi)` 错误通常是由于尝试从一个空或不合法的矩阵创建子矩阵(ROI)的时候引发的。该问题可能发生在访问外部区域时造成的,有可能是对 `cv::Rect` 创建时不合法的数值操作引发。
考虑到大图处理和操作系统内存限制,你可以按以下方式确保逻辑和内存安全:
- #include <opencv2/opencv.hpp>
- cv::Mat rotateBlock(const cv::Mat& block, double angle) {
- cv::Point2f center(block.cols / 2.0, block.rows / 2.0);
- cv::Mat rot_mat = cv::getRotationMatrix2D(center, angle, 1.0);
- cv::Rect bbox = cv::RotatedRect(center, block.size(), angle).boundingRect();
- cv::Mat adjusted_rot_mat = rot_mat.clone();
- adjusted_rot_mat.at<double>(0, 2) += (bbox.width / 2) - center.x;
- adjusted_rot_mat.at<double>(1, 2) += (bbox.height / 2) - center.y;
- cv::Mat rotatedBlock;
- cv::warpAffine(block, rotatedBlock, adjusted_rot_mat, bbox.size(), cv::INTER_LINEAR, cv::BORDER_CONSTANT, cv::Scalar(0));
- return rotatedBlock;
- }
- int main() {
- cv::Mat image = cv::imread("bigpicture.tif", cv::IMREAD_UNCHANGED);
- if (image.empty()) {
- std::cerr << "Error: Could not load image." << std::endl;
- return 1;
- }
- int block_height = 100;
- double angle = 75;
- cv::Size finalSize = cv::RotatedRect(cv::Point2f(image.cols / 2.0, image.rows / 2.0), image.size(), angle).boundingRect().size();
- cv::Mat result(finalSize, image.type(), cv::Scalar(0));
- for (int y = 0; y < image.rows; y += block_height) {
- cv::Rect roi(0, y, image.cols, std::min(block_height, image.rows - y));
- cv::Mat block = image(roi);
- cv::Mat rotatedBlock = rotateBlock(block, angle);
- int newY = static_cast<int>(y * static_cast<double>(finalSize.height) / image.rows);
- cv::Rect targetRoi(0, newY, rotatedBlock.cols, rotatedBlock.rows);
- if (newY + rotatedBlock.rows <= finalSize.height) {
- rotatedBlock.copyTo(result(targetRoi));
- } else {
- cv::Mat validRegion = result(cv::Rect(0, newY, rotatedBlock.cols, finalSize.height - newY));
- rotatedBlock(cv::Rect(0, 0, rotatedBlock.cols, validRegion.rows)).copyTo(validRegion);
- }
- }
- cv::imwrite("output.tif", result);
- return 0;
- }
复制代码
### 说明:
1. **检查边缘条件**:确保在执行 `copyTo` 时合理限制矩阵的边界。
2. **预检查和裁剪操作**:通过检查 `targetRoi` 来确保合法性。
3. **详细错误输出**:在 `image.empty()` 时给出详细原因提示。
注意尝试小步骤验证逐步减小复杂度,确保对块的细致管理。若对 OpenCV 类型和参数(如 `Rect`)不熟悉,检查 API 文档以了解布尔操作及矩阵处理的细节。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|