美文网首页
2019-06-22(day004)——c++代码中的新知识点:

2019-06-22(day004)——c++代码中的新知识点:

作者: 雨住多一横 | 来源:发表于2019-06-23 13:52 被阅读0次

python

import cv2 as cv

src = cv.imread("D:/vcprojects/images/test.png")
cv.namedWindow("input", cv.WINDOW_AUTOSIZE)
cv.imshow("input", src)
h, w, ch = src.shape
print("h , w, ch", h, w, ch)
for row in range(h):
    for col in range(w):
        b, g, r = src[row, col]
        b = 255 - b
        g = 255 - g
        r = 255 - r
        src[row, col] = [b, g, r]
cv.imshow("output", src)

cv.waitKey(0)
cv.destroyAllWindows()

c++

#include "all.h"
using namespace std;
using namespace cv;

void MyClass::day004() {
    Mat img = read(PATH + "images\\test.jpg");
    if (img.empty()) {
        printf("can't open image");
        return;
    }
    imshow("input", img);
    int rows = img.rows;
    int cols = img.cols;
    int cnnel = img.channels();
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            if (cnnel == 3)
            {
                Vec3b bgr = img.at<Vec3b>(i, j);
                bgr[0] -= 255;
                bgr[1] -= 255;
                bgr[2] -= 255;
                img.at<Vec3b>(i, j) = bgr;
            }
            else if (cnnel == 1) {
                int gray = img.at<uchar>(i, j);
                gray -= 255;
                img.at<uchar>(i, j) = gray;
            }
        }
    }
    imshow("outputByDirectlyRead", img);
    Mat result = Mat::zeros(img.size(), img.type());
    int blue = 0; int green = 0; int red = 0;
    int gray;
    for (int i = 0; i < rows; i++) {
        uchar *curr_row = img.ptr<uchar>(i);
        uchar *result_row = result.ptr<uchar>(i);
        for (int j = 0; j < rows; j++) {
            if (cnnel == 3) {
                blue = *curr_row++;
                green = *curr_row++;
                red = *curr_row++;

                *result_row++ = blue;
                *result_row++ = green;
                *result_row++ = red;
            }
            else if (cnnel == 1) {
                gray = *curr_row++;
                *result_row++ = gray;
            }

        }
    }
    imshow("outputByPtrRead", result);
    waitKey(0);
}

c++代码中的新知识点:

  • Vec3b的使用
  • 模板方法:Mat::at<type>(row, col);取某个像素点
  • 模板方法:Mat::ptr<type>(row);指向一行像素的起始地址
  • 数据类型:uchar

相关文章

网友评论

      本文标题:2019-06-22(day004)——c++代码中的新知识点:

      本文链接:https://www.haomeiwen.com/subject/sdhbqctx.html