先放书里的源码。
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/
转载文章受原作者版权保护。转载请注明原作者出处!