mat.data

1. data

mat.data是指向OpenCV图像或矩阵数据的指针,通过mat.data,可以获取指向图像像素数据的指针,支持访问、修改图像中的像素值

#include <opencv2/opencv.hpp>

int main() {
    // 读取图像
    cv::Mat image = cv::imread("image.jpg", cv::IMREAD_COLOR);

    // 检查图像是否成功加载
    if (image.empty()) {
        std::cout << "无法加载图像" << std::endl;
        return -1;
    }

    // 获取图像的宽度和高度
    int width = image.cols;
    int height = image.rows;

    // 获取图像的通道数
    int channels = image.channels();

    // 遍历图像的像素
    for (int y = 0; y < height; y++) {
        for (int x = 0; x < width; x++) {
            // 计算像素的索引
            int index = y * width * channels + x * channels;

            // 访问像素值
            unsigned char b = image.data[index];
            unsigned char g = image.data[index + 1];
            unsigned char r = image.data[index + 2];

            // 对像素值进行操作
            // ...

            // 修改像素值
            image.data[index] = new_b;
            image.data[index + 1] = new_g;
            image.data[index + 2] = new_r;
        }
    }

    // 保存修改后的图像
    cv::imwrite("modified_image.jpg", image);

    return 0;
}

2. 像素排列方式

int index = y * width * channels + x * channels

unsigned char b = image.data[index]

unsigned char g = image.data[index + 1]

unsigned char r = image.data[index + 2]

同一像素位置的三个值是相邻的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
优化代码:#include <stdio.h> #include <stdlib.h> #define Maxsize 100 typedef struct { int i, j; int v; } Triple; typedef struct { Triple data[Maxsize + 1]; int m, n, t; } TSmatrix; void inputMatrix(TSmatrix *mat) { printf("输入行数和列数: "); scanf("%d %d", &(mat->m), &(mat->n)); printf("输入非零元素的数量: "); scanf("%d", &(mat->t)); printf("按格式输入元素(行-列值):\n"); int k = 1; for (k = 1; k <= mat->t; k++) { scanf("%d %d %d", &(mat->data[k].i), &(mat->data[k].j), &(mat->data[k].v)); } } void printMatrix(TSmatrix mat) { printf("矩阵为:\n"); int i,j,k; for (i = 1; i <= mat.m; i++) { for (j = 1; j <= mat.n; j++) { int found = 0; for (k = 1; k <= mat.t; k++) { if (mat.data[k].i == i && mat.data[k].j == j) { printf("%d ", mat.data[k].v); found = 1; break; } } if (!found) printf("0 "); } printf("\n"); } } TSmatrix addMatrix(TSmatrix mat1, TSmatrix mat2) { TSmatrix result; result.m = mat1.m; result.n = mat1.n; int i = 1, j = 1, k = 1; while (i <= mat1.t && j <= mat2.t) { if (mat1.data[i].i < mat2.data[j].i) { result.data[k++] = mat1.data[i++]; } else if (mat1.data[i].i > mat2.data[j].i) { result.data[k++] = mat2.data[j++]; } else { if (mat1.data[i].j < mat2.data[j].j) { result.data[k++] = mat1.data[i++]; } else if (mat1.data[i].j > mat2.data[j].j) { result.data[k++] = mat2.data[j++]; } else { result.data[k].i = mat1.data[i].i; result.data[k].j = mat1.data[i].j; result.data[k++].v = mat1.data[i++].v + mat2.data[j++].v; } } } while (i <= mat1.t) result.data[k++] = mat1.data[i++]; while (j <= mat2.t) result.data[k++] = mat2.data[j++]; result.t = k - 1; return result; } int main() { TSmatrix m1, m2, m3; inputMatrix(&m1); printf("输入第一个矩阵:"); printMatrix(m1); inputMatrix(&m2); printf("输入第二个矩阵:") ; printMatrix(m2); m3 = addMatrix(m1, m2); printf("两矩阵之和为:\n"); printMatrix(m3); return 0; }
06-03
以下是优化后的代码: ```c #include <stdio.h> #include <stdlib.h> #define Maxsize 100 typedef struct { int i, j; int v; } Triple; typedef struct { Triple data[Maxsize + 1]; int m, n, t; } TSmatrix; void inputMatrix(TSmatrix *mat) { printf("输入行数和列数: "); scanf("%d %d", &(mat->m), &(mat->n)); printf("输入非零元素的数量: "); scanf("%d", &(mat->t)); printf("按格式输入元素(行-列值):\n"); for (int k = 1; k <= mat->t; k++) { scanf("%d %d %d", &(mat->data[k].i), &(mat->data[k].j), &(mat->data[k].v)); } } void printMatrix(TSmatrix mat) { printf("矩阵为:\n"); for (int i = 1, k = 1; i <= mat.m; i++) { for (int j = 1; j <= mat.n; j++) { if (mat.data[k].i == i && mat.data[k].j == j) { printf("%d ", mat.data[k].v); k++; } else { printf("0 "); } } printf("\n"); } } TSmatrix addMatrix(TSmatrix mat1, TSmatrix mat2) { TSmatrix result; result.m = mat1.m; result.n = mat1.n; int i = 1, j = 1, k = 1; while (i <= mat1.t && j <= mat2.t) { if (mat1.data[i].i < mat2.data[j].i) { result.data[k++] = mat1.data[i++]; } else if (mat1.data[i].i > mat2.data[j].i) { result.data[k++] = mat2.data[j++]; } else { if (mat1.data[i].j < mat2.data[j].j) { result.data[k++] = mat1.data[i++]; } else if (mat1.data[i].j > mat2.data[j].j) { result.data[k++] = mat2.data[j++]; } else { result.data[k].i = mat1.data[i].i; result.data[k].j = mat1.data[i].j; result.data[k++].v = mat1.data[i++].v + mat2.data[j++].v; } } } while (i <= mat1.t) result.data[k++] = mat1.data[i++]; while (j <= mat2.t) result.data[k++] = mat2.data[j++]; result.t = k - 1; return result; } int main() { TSmatrix m1, m2, m3; inputMatrix(&m1); printf("输入第一个矩阵:"); printMatrix(m1); inputMatrix(&m2); printf("输入第二个矩阵:"); printMatrix(m2); m3 = addMatrix(m1, m2); printf("两矩阵之和为:\n"); printMatrix(m3); return 0; } ``` 主要优化点如下: 1. 将循环变量的声明放在循环外部,使得代码更加简洁易读。 2. 在打印矩阵的函数中,使用一个额外的变量 `k` 来遍历稀疏矩阵,避免使用三重循环,提高了代码的效率。 3. 优化了变量名的命名方式,使得代码更加规范易懂。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值