int up, down; for (size_t j = result.cols - 1; j > 0; j--) { if (result.at<cv::Vec3b>(0, j) != cv::Vec3b(0, 0, 0)) { up = j; break; } } for (size_t j = result.cols - 1; j > 0; j--) { if (result.at<cv::Vec3b>(result.rows - 1, j) != cv::Vec3b(0, 0, 0)) { down = j; break; } } result = result(cv::Rect(0, 0, std::min(up, down) - 1, result.rows)); for (size_t i = 0; i < result.rows; i++) { if (result.at<cv::Vec3b>(i, img1.cols) != cv::Vec3b(0, 0, 0)) { up = i; break; } } for (size_t i = result.rows - 1; i > 0; i--) { if (result.at<cv::Vec3b>(i, img1.cols) != cv::Vec3b(0, 0, 0)) { down = i; break; } } cv::Mat img = result(cv::Rect(0, up + 1, result.cols, down - up - 1));解析
时间: 2024-03-19 12:41:55 浏览: 29
这段代码是对融合后的图像进行裁剪的过程。
首先,在变量up和down中分别记录融合后图像最上方和最下方不为全黑像素的列数。其中,up初始化为result.cols,down初始化为0。
接着,通过两个循环分别从融合后图像的最上方和最下方开始,遍历每一列像素,如果该列不是全黑像素,则将up或down更新为当前列数。
然后,通过ROI(Region of Interest)机制,将result变量中up和down之间的区域裁剪出来。其中,up和down分别加1和减1是为了避免裁剪出空白像素。
最后,将裁剪后的图像存储到img变量中。
相关问题
我想用c语言实现十字链表做矩阵加法
当然可以,以下是用 C 语言实现十字链表做矩阵加法的示例代码:
```
#include <stdio.h>
#include <stdlib.h>
struct MatrixNode {
int row;
int col;
int value;
struct MatrixNode* right;
struct MatrixNode* down;
};
struct CrossMatrix {
int rows;
int cols;
struct MatrixNode** row_heads;
struct MatrixNode** col_heads;
struct MatrixNode* head;
};
struct MatrixNode* create_node(int row, int col, int value) {
struct MatrixNode* node = (struct MatrixNode*)malloc(sizeof(struct MatrixNode));
node->row = row;
node->col = col;
node->value = value;
node->right = NULL;
node->down = NULL;
return node;
}
struct CrossMatrix* create_cross_matrix(int rows, int cols) {
struct CrossMatrix* matrix = (struct CrossMatrix*)malloc(sizeof(struct CrossMatrix));
matrix->rows = rows;
matrix->cols = cols;
matrix->row_heads = (struct MatrixNode**)malloc(rows * sizeof(struct MatrixNode*));
matrix->col_heads = (struct MatrixNode**)malloc(cols * sizeof(struct MatrixNode*));
matrix->head = create_node(-1, -1, 0);
matrix->head->right = matrix->col_heads[0] = create_node(-1, 0, 0);
matrix->head->down = matrix->row_heads[0] = create_node(0, -1, 0);
for (int i = 1; i < rows; i++) {
matrix->row_heads[i] = create_node(i, -1, 0);
matrix->row_heads[i - 1]->down = matrix->row_heads[i];
}
for (int i = 1; i < cols; i++) {
matrix->col_heads[i] = create_node(-1, i, 0);
matrix->col_heads[i - 1]->right = matrix->col_heads[i];
}
return matrix;
}
void insert(struct CrossMatrix* matrix, int row, int col, int value) {
struct MatrixNode* node = create_node(row, col, value);
struct MatrixNode* row_head = matrix->row_heads[row];
struct MatrixNode* col_head = matrix->col_heads[col];
struct MatrixNode* current_node = row_head;
while (current_node->right && current_node->right->col < col) {
current_node = current_node->right;
}
node->right = current_node->right;
current_node->right = node;
current_node = col_head;
while (current_node->down && current_node->down->row < row) {
current_node = current_node->down;
}
node->down = current_node->down;
current_node->down = node;
}
struct CrossMatrix* add(struct CrossMatrix* matrix1, struct CrossMatrix* matrix2) {
if (matrix1->rows != matrix2->rows || matrix1->cols != matrix2->cols) {
printf("Matrices must have the same size\n");
return NULL;
}
struct CrossMatrix* result = create_cross_matrix(matrix1->rows, matrix1->cols);
for (int i = 0; i < matrix1->rows; i++) {
struct MatrixNode* current_node1 = matrix1->row_heads[i]->right;
struct MatrixNode* current_node2 = matrix2->row_heads[i]->right;
while (current_node1 || current_node2) {
if (current_node1 && (!current_node2 || current_node1->col < current_node2->col)) {
insert(result, i, current_node1->col, current_node1->value);
current_node1 = current_node1->right;
}
else if (current_node2 && (!current_node1 || current_node2->col < current_node1->col)) {
insert(result, i, current_node2->col, current_node2->value);
current_node2 = current_node2->right;
}
else {
insert(result, i, current_node1->col, current_node1->value + current_node2->value);
current_node1 = current_node1->right;
current_node2 = current_node2->right;
}
}
}
return result;
}
void print_matrix(struct CrossMatrix* matrix) {
for (int i = 0; i < matrix->rows; i++) {
struct MatrixNode* current_node = matrix->row_heads[i]->right;
for (int j = 0; j < matrix->cols; j++) {
if (current_node && current_node->col == j) {
printf("%d ", current_node->value);
current_node = current_node->right;
}
else {
printf("0 ");
}
}
printf("\n");
}
}
int main() {
struct CrossMatrix* matrix1 = create_cross_matrix(3, 3);
insert(matrix1, 0, 0, 1);
insert(matrix1, 0, 1, 2);
insert(matrix1, 1, 1, 3);
insert(matrix1, 1, 2, 4);
insert(matrix1, 2, 0, 5);
insert(matrix1, 2, 2, 6);
struct CrossMatrix* matrix2 = create_cross_matrix(3, 3);
insert(matrix2, 0, 0, 7);
insert(matrix2, 0, 1, 8);
insert(matrix2, 1, 1, 9);
insert(matrix2, 1, 2, 10);
insert(matrix2, 2, 0, 11);
insert(matrix2, 2, 2, 12);
struct CrossMatrix* result = add(matrix1, matrix2);
print_matrix(result);
return 0;
}
```
这里使用了结构体实现节点和矩阵,定义了`create_node`和`create_cross_matrix`函数用于创建节点和十字链表形式的矩阵。还定义了`insert`和`add`函数用于插入节点和进行矩阵加法。最后,使用`print_matrix`函数打印出矩阵。
十字链表储存稀疏矩阵及稀疏矩阵相乘 C代码
下面是用十字链表储存稀疏矩阵和实现稀疏矩阵相乘的 C 代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义十字链表节点
typedef struct {
int row; // 行下标
int col; // 列下标
int value; // 元素值
struct Node* right; // 指向右边的节点
struct Node* down; // 指向下方的节点
} Node;
// 定义十字链表
typedef struct {
int rows; // 矩阵的行数
int cols; // 矩阵的列数
Node* row_heads; // 行头节点数组
Node* col_heads; // 列头节点数组
} CrossList;
// 创建稀疏矩阵对应的十字链表
CrossList* createCrossList(int rows, int cols) {
CrossList* matrix = (CrossList*)malloc(sizeof(CrossList));
matrix->rows = rows;
matrix->cols = cols;
matrix->row_heads = (Node*)malloc(rows * sizeof(Node));
matrix->col_heads = (Node*)malloc(cols * sizeof(Node));
// 初始化头节点数组
for (int i = 0; i < rows; i++) {
matrix->row_heads[i].right = NULL;
matrix->row_heads[i].down = NULL;
}
for (int j = 0; j < cols; j++) {
matrix->col_heads[j].right = NULL;
matrix->col_heads[j].down = NULL;
}
return matrix;
}
// 向十字链表中插入元素
void insertElement(CrossList* matrix, int row, int col, int value) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->row = row;
newNode->col = col;
newNode->value = value;
// 插入新节点到行链表中
Node* row_head = &(matrix->row_heads[row]);
Node* cur = row_head;
while (cur->right != NULL && cur->right->col < col) {
cur = cur->right;
}
newNode->right = cur->right;
cur->right = newNode;
// 插入新节点到列链表中
Node* col_head = &(matrix->col_heads[col]);
cur = col_head;
while (cur->down != NULL && cur->down->row < row) {
cur = cur->down;
}
newNode->down = cur->down;
cur->down = newNode;
}
// 打印稀疏矩阵的十字链表表示
void printCrossList(CrossList* matrix) {
for (int i = 0; i < matrix->rows; i++) {
Node* node = matrix->row_heads[i].right;
for (int j = 0; j < matrix->cols; j++) {
if (node != NULL && node->col == j) {
printf("%d ", node->value);
node = node->right;
} else {
printf("0 ");
}
}
printf("\n");
}
}
// 稀疏矩阵相乘
CrossList* multiplySparseMatrix(CrossList* matrix1, CrossList* matrix2) {
if (matrix1->cols != matrix2->rows) {
printf("Cannot multiply the matrices!");
return NULL;
}
CrossList* result = createCrossList(matrix1->rows, matrix2->cols);
for (int i = 0; i < matrix1->rows; i++) {
Node* row_head = &(matrix1->row_heads[i]);
Node* node1 = row_head->right;
for (int j = 0; j < matrix2->cols; j++) {
Node* col_head = &(matrix2->col_heads[j]);
Node* node2 = col_head->down;
int value = 0;
while (node1 != NULL && node2 != NULL) {
if (node1->col < node2->row) {
node1 = node1->right;
} else if (node1->col > node2->row) {
node2 = node2->down;
} else {
value += node1->value * node2->value;
node1 = node1->right;
node2 = node2->down;
}
}
if (value != 0) {
insertElement(result, i, j, value);
}
}
}
return result;
}
// 测试代码
int main() {
CrossList* matrix1 = createCrossList(3, 3);
insertElement(matrix1, 0, 0, 1);
insertElement(matrix1, 0, 2, 2);
insertElement(matrix1, 1, 1, 3);
insertElement(matrix1, 2, 0, 4);
insertElement(matrix1, 2, 2, 5);
CrossList* matrix2 = createCrossList(3, 3);
insertElement(matrix2, 0, 0, 1);
insertElement(matrix2, 0, 1, 2);
insertElement(matrix2, 1, 1, 3);
insertElement(matrix2, 1, 2, 4);
insertElement(matrix2, 2, 0, 5);
CrossList* result = multiplySparseMatrix(matrix1, matrix2);
printf("Result:\n");
printCrossList(result);
return 0;
}
```
这段代码实现了稀疏矩阵的十字链表存储以及稀疏矩阵的乘法操作。你可以根据需要修改矩阵的大小和元素值进行测试。