【SLAM十四讲】CH5. imageBasics.cpp 学习笔记

先放书里的源码。
ch5/imageBasics/imageBasics.cpp

#include
#include

using namespace std;

#include
#include

int main(int argc, char **argv) {

  cv::Mat image;
  image = cv::imread(argv[1]);

  if (image.data == nullptr) {
    cerr << "文件" << argv[1] << "不存在." << endl;
    return 0;
  }

  cout << "图像宽为" << image.cols << ",高为" << image.rows << ",通道数为" << image.channels() << endl;
  cv::imshow("image", image);
  cv::waitKey(0);

  if (image.type() != CV_8UC1 && image.type() != CV_8UC3) {

    cout << "请输入一张彩色图或灰度图." << endl;
    return 0;
  }

  chrono::steady_clock::time_point t1 = chrono::steady_clock::now();
  for (size_t y = 0; y < image.rows; y++) {

    unsigned char *row_ptr = image.ptr<unsigned char>(y);
    for (size_t x = 0; x < image.cols; x++) {

      unsigned char *data_ptr = &row_ptr[x * image.channels()];

      for (int c = 0; c != image.channels(); c++) {
        unsigned char data = data_ptr[c];
      }
    }
  }
  chrono::steady_clock::time_point t2 = chrono::steady_clock::now();
  chrono::duration<double> time_used = chrono::duration_cast < chrono::duration < double >> (t2 - t1);
  cout << "遍历图像用时:" << time_used.count() << " 秒。" << endl;

  cv::Mat image_another = image;

  image_another(cv::Rect(0, 0, 100, 100)).setTo(0);
  cv::imshow("image", image);
  cv::waitKey(0);

  cv::Mat image_clone = image.clone();
  image_clone(cv::Rect(0, 0, 100, 100)).setTo(255);
  cv::imshow("image", image);
  cv::imshow("image_clone", image_clone);
  cv::waitKey(0);

  cv::destroyAllWindows();
  return 0;
}

这段代码首先需要完成以下几个功能:

所以可以使用这几个包:

那么接下来要拟定算法流程。
1.使用OpenCV读取图像文件。
2.对其中图像像素进行操作,满足修改条件。
3.使用highgui读取图像并输出显示。


cv::imshow("修改前的image",image);

4.给以上模块套上chrono计时器。


chrono::steady_clock::time_point t1 = chrono::steady_clock::now();

chrono::steady_clock::time_point t2 = chrono::steady_clock::now();

chrono::duration<double> time_used = chrono::duration_cast < chrono::duration < double >> (t2 - t1);
cout << "遍历图像用时:" << time_used.count() << " 秒。" << endl;

首先完成第一部分的功能:


cv::Mat image;

image = cv::imread(argv[1]);

if(!image.empty()){

  cerr << "文件" << argv[1] << "不存在。" << endl;
}

cout << "rows:" << image.rows << ".cols:" << cols << ".channels:" << image.channels() << endl;

if (image.type() != CV_8UC1 && image.type() != CV_8UC3) {

  cout << "请输入一张彩色图或灰度图." << endl;
  return 0;
}

接下来完成程序第二部分的功能,对图像的像素进行操作。

首先实现对指定像素中指定通道的数值读取与操作。
关于使用OpenCV对Mat数据结构的像素操作进行操作,有三种方法。详情可看这里:Mat中像素的获取与赋值
使用cv::Mat::ptr()成员方法,虽然可读性可能有些不便,但是效率和健全性上更有保障。
ptr()方法输入行数y(数据类型由模板指定),返回图像第y行的首地址(数据类型为uchar)。
要访问Mat中的第y行,第x列像素的第c个通道的值,可以使用以下方法。*


uchar * row_ptr = image.ptr<uchar>(y);

uchar * data_ptr = &row_ptr[x * image.channels()];

uchar data = data_ptr[c];

data_ptr[c] = 0 ;

在教材中,要求我们将一张图像复制,并对复制品左上角100*100的图像全改成白色。
虽然以上方法也可以实现,但是opencv也提供了方便的函数可供调用。


image_clone = image.clone();

cv::imshow("image_clone",image_clone);

image_clone(cv::Rect(0,0,100,100)).setTo(255);

cv::imshow("image_clone",image_clone);

接下来,再将以上的代码部分拼接在一起,便可完成imageBasics程序的要求。
记得先把包都导进来。

Original: https://blog.csdn.net/HARYORE/article/details/126464465
Author: KAVOLO
Title: 【SLAM十四讲】CH5. imageBasics.cpp 学习笔记

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/703895/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球