# 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的倍數時,需調整子圖大?。?/p>
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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。