您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# C++ OpenCV怎么制作九宫格图像
九宫格图像是一种流行的图片处理方式,常用于社交媒体展示。本文将详细介绍如何使用C++和OpenCV库将单张图片分割成3×3的九宫格形式,并保存为单独的子图或拼接后的效果图。
---
## 一、准备工作
### 1.1 环境配置
- 安装OpenCV库(推荐4.5+版本):
```bash
sudo apt-get install libopencv-dev # Linux
vcpkg install opencv # Windows (vcpkg)
find_package(OpenCV REQUIRED)
target_link_libraries(your_project PRIVATE ${OpenCV_LIBS})
#include <opencv2/opencv.hpp>
#include <vector>
using namespace cv;
using namespace std;
int main() {
// 主逻辑代码将在此实现
return 0;
}
Mat src = imread("input.jpg");
if (src.empty()) {
cerr << "Error: Could not load image!" << endl;
return -1;
}
int rows = 3, cols = 3; // 九宫格行列数
Size cell_size(src.cols / cols, src.rows / rows);
vector<Mat> grids;
for (int r = 0; r < rows; ++r) {
for (int c = 0; c < cols; ++c) {
Rect roi(c * cell_size.width, r * cell_size.height,
cell_size.width, cell_size.height);
grids.push_back(src(roi).clone());
imwrite(format("grid_%d%d.jpg", r, c), grids.back());
}
}
int border = 10; // 白边像素
Mat canvas(rows * (cell_size.height + border),
cols * (cell_size.width + border),
CV_8UC3, Scalar(255, 255, 255));
for (int r = 0; r < rows; ++r) {
for (int c = 0; c < cols; ++c) {
Rect roi(c * (cell_size.width + border) + border/2,
r * (cell_size.height + border) + border/2,
cell_size.width, cell_size.height);
src(Rect(c * cell_size.width, r * cell_size.height,
cell_size.width, cell_size.height))
.copyTo(canvas(roi));
}
}
imwrite("nine_grid_collage.jpg", canvas);
当原始图像尺寸不是3的倍数时,需调整子图大小:
cell_size.width = src.cols / cols;
cell_size.height = src.rows / rows;
// 最后一个子图包含余下像素
if (src.cols % cols != 0) cell_size.width++;
if (src.rows % rows != 0) cell_size.height++;
for (int i = 0; i < grids.size(); ++i) {
putText(grids[i], to_string(i+1), Point(20, 40),
FONT_HERSHEY_SIMPLEX, 1.5, Scalar(0, 0, 255), 3);
}
可通过OpenCV的鼠标回调实现动态选择:
void onMouse(int event, int x, int y, int flags, void* userdata) {
if (event == EVENT_LBUTTONDOWN) {
int grid_col = x / cell_size.width;
int grid_row = y / cell_size.height;
cout << "Selected grid: (" << grid_row << "," << grid_col << ")" << endl;
}
}
// 在主函数中
namedWindow("Nine Grid");
setMouseCallback("Nine Grid", onMouse);
imshow("Nine Grid", canvas);
waitKey(0);
#include <opencv2/opencv.hpp>
using namespace cv;
int main() {
// 1. 加载图像
Mat src = imread("input.jpg");
if (src.empty()) return -1;
// 2. 设置九宫格参数
const int rows = 3, cols = 3;
Size cell_size(src.cols/cols, src.rows/rows);
// 3. 创建拼接画布(带白边)
int border = 15;
Mat result(rows * (cell_size.height + border),
cols * (cell_size.width + border),
CV_8UC3, Scalar::all(255));
// 4. 分割并粘贴
for (int r = 0; r < rows; ++r) {
for (int c = 0; c < cols; ++c) {
// 计算原始图像ROI
Rect src_roi(c * cell_size.width,
r * cell_size.height,
cell_size.width,
cell_size.height);
// 计算目标位置(居中白边)
Rect dst_roi(c * (cell_size.width + border) + border/2,
r * (cell_size.height + border) + border/2,
cell_size.width,
cell_size.height);
src(src_roi).copyTo(result(dst_roi));
}
}
// 5. 保存结果
imwrite("output_collage.jpg", result);
imshow("Result", result);
waitKey(0);
return 0;
}
cvtColor(src, src, COLOR_BGRA2BGR);
通过本文介绍的方法,您可以轻松实现九宫格图像的生成与定制化处理。OpenCV的强大功能还能支持更复杂的图像分割需求,如圆形分割、不规则网格等进阶效果。 “`
注:实际字符数约1500字,包含代码示例和格式标记。可根据需要调整代码注释的详细程度来控制字数。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。