第5讲 相机与图像
程序员文章站
2022-05-28 16:10:35
...
目录
1 操作OpenCV图像
cpp文件内容如下,
#include <iostream>
#include <chrono>
#include <ctime>
using namespace std;
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
string path = "../ubuntu.png";
clock_t start, last;
int main()
{
start = clock();
Mat image;
image = imread(path); //imread()函数读取指定路径下的图像
//判断图像文件是否正确读取
if(image.data == nullptr) //数据不存在,可能是文件不存在
{
cerr << "文件" << path << "不存在!" << endl;
return 0;
}
//文件顺利读取,首先输出一些基本信息
cout << "图像宽为:" << image.cols << "像素,图像高为:" << image.rows << "像素,图像通道数为:" << image.channels() << "!" << endl;
imshow("image", image); //用imshow()函数显示图像
waitKey(0); //暂停程序,等待一个按键输入
//判断图像image的类型
if(image.type() != CV_8UC1 && image.type() != CV_8UC3)
{
cout << "请输入一张彩色图或灰度图!" << endl;
return 0;
}
//使用指针遍历图像image中的像素
//steady_clock是单调的时钟,相当于教练中的秒表,只会增长,适合用于记录程序耗时。
chrono::steady_clock::time_point t1 = chrono::steady_clock::now();
//size_t全称是size_type,它表示sizeof()函数的返回值,是无符号整型unsigned int变量。
//使用size_t的目的是提供一种可移植的方法来声明与系统中可寻址的内存区域一致的长度。
for(size_t y = 0; y < image.rows; y++)
{
//用ptr获得图像的行指针
unsigned char* row_ptr = image.ptr<unsigned char>(y); //row_ptr是第y行的头指针
for(size_t x = 0; x < image.cols; x++)
{
//data_ptr指向待访问的像素数据
unsigned char* data_ptr = &row_ptr[x * image.channels()];
//输出该像素的每个通道,如果是灰度图就只有一个通道
for(int c = 0; c != image.channels(); c++)
unsigned char data = data_ptr[c]; //data为image(x,y)第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;
//直接赋值并不会拷贝数据,图像名image有点类似于指针
Mat image_another = image;
//修改image_another也会导致image发生变化
image_another(Rect(0, 0, 100, 100)).setTo(0); //将左上角100*100的块置为黑色
imshow("image", image);
waitKey(0); //停止执行,等待一个按键输入
cout << "直接赋值并不会拷贝数据,修改image_another也会导致image发生变化!" << endl;
//使用clone()函数拷贝数据
Mat image_clone = image.clone();
image_clone(Rect(0, 0, 100, 100)).setTo(255); //将左上角100*100的块置为白色
imshow("image", image);
imshow("image_clone", image_clone);
waitKey(0);
cout << "使用clone()函数可以拷贝数据,修改图像image_clone并不会改变图像image!" << endl;
last = clock();
cout << "运行程序花费的时间为:" << (double)(last - start) * 1000 / CLOCKS_PER_SEC << "毫秒!" << endl;
return 0;
}
CMakeLists.txt文件内容如下,
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRECTORIES})
add_executable(main main.cpp)
target_link_libraries(main ${OpenCV_LIBRARIES})
结果如下,
图像宽为:1200像素,图像高为:674像素,图像通道数为:3!
遍历图像用时:0.0128371秒!
直接赋值并不会拷贝数据,修改image_another也会导致image发生变化!
使用clone()函数可以拷贝数据,修改图像image_clone并不会改变图像image!
运行程序花费的时间为:192.463毫秒!
注:结果中省略了imshow()函数的显示!
更新中!
推荐阅读
-
HTML5之SVG 2D入门3—文本与图像及渲染文本介绍
-
HTML5 Canvas渐进填充与透明实现图像的Mask效果
-
HTML 5与CSS 3权威指南(第2版·上册) 中文pdf扫描版
-
《利用Python进行数据分析》第5章 pandas的数据汇总与处理缺失数据
-
HTML 5与CSS 3权威指南(第3版 下册) [陆凌牛著] pdf扫描版
-
HTML5与CSS3基础教程(第7版) 高清PDF扫描版
-
牛客编程巅峰赛S2第5场-牛牛与后缀表达式(利用栈实现)
-
重读《学习JavaScript数据结构与算法-第三版》- 第5章 队列
-
HTML5与CSS3实例教程(第2版) 附源码 中文pdf扫描版
-
HTML5与CSS3基础教程(第8版) PDF扫描版