摘要:下面的程序是书里的源代码,其中可以用这两种方式,具体看能不能编译成功,如果有报错的话可以用下面这种方式。
下面的程序是书里的源代码,其中
#include
#include
//#include
//#include
可以用这两种方式,具体看能不能编译成功,如果有报错的话可以用下面这种方式。
#include #include using namespace std;#include #include //#include //#include int main(int argc, char **argv) { // 读取argv[1]指定的图像 cv::Mat image; image = cv::imread(argv[1]); //cv::imread函数读取指定路径下的图像 // 判断图像文件是否正确读取 if (image.data == nullptr) { //数据不存在,可能是文件不存在 cerr << "文件" << argv[1] << "不存在." << endl; return 0; } // 文件顺利读取, 首先输出一些基本信息 cout << "图像宽为" << image.cols << ",高为" << image.rows << ",通道数为" << image.channels() << endl; cv::imshow("image", image); // 用cv::imshow显示图像 cv::waitKey(0); // 暂停程序,等待一个按键输入 // 判断image的类型 if (image.type() != CV_8UC1 && image.type() != CV_8UC3) { // 图像类型不符合要求 cout << "请输入一张彩色图或灰度图." << endl; return 0; } // 遍历图像, 请注意以下遍历方式亦可使用于随机像素访问 // 使用 std::chrono 来给算法计时 chrono::steady_clock::time_point t1 = chrono::steady_clock::now(); for (size_t y = 0; y < image.rows; y++) { // 用cv::Mat::ptr获得图像的行指针 unsigned char *row_ptr = image.ptr(y); // row_ptr是第y行的头指针 for (size_t x = 0; x < image.cols; x++) { // 访问位于 x,y 处的像素 unsigned char *data_ptr = &row_ptr[x * image.channels()]; // data_ptr 指向待访问的像素数据 // 输出该像素的每个通道,如果是灰度图就只有一个通道 for (int c = 0; c != image.channels(); c++) { unsigned char data = data_ptr[c]; // data为I(x,y)第c个通道的值 } } } chrono::steady_clock::time_point t2 = chrono::steady_clock::now(); chrono::duration time_used = chrono::duration_cast < chrono::duration < double >> (t2 - t1); cout << "遍历图像用时:" << time_used.count() << " 秒。" << endl; // 关于 cv::Mat 的拷贝 // 直接赋值并不会拷贝数据 cv::Mat image_another = image; // 修改 image_another 会导致 image 发生变化 image_another(cv::Rect(0, 0, 100, 100)).setTo(0); // 将左上角100*100的块置零 cv::imshow("image", image); cv::waitKey(0); // 使用clone函数来拷贝数据 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); // 对于图像还有很多基本的操作,如剪切,旋转,缩放等,限于篇幅就不一一介绍了,请参看OpenCV官方文档查询每个函数的调用方法. cv::destroyAllWindows(); return 0;}
CMakeLists.txt如下:
需要对原来的txt进行修改:
project(imageBasics)cmake_minimum_required(VERSION 3.10)add_executable(imageBasics imageBasics.cpp)# 链接OpenCV库find_package( OpenCV REQUIRED )#添加头文件include_directories( ${OpenCV-INCLUDE_DIRS})target_link_libraries(imageBasics ${OpenCV_LIBS})add_executable(undistortImage undistortImage.cpp)# 链接OpenCV库target_link_libraries(undistortImage ${OpenCV_LIBS})set(CMAKE_CXX_FLAGS "-std=c++11")
编译的步骤还是一样:进入imageBasics文件夹:
mkdir buildcd buildcmake ..make -j4
编译成功后,执行下面的命令,和书上的命令稍微不一样,如果直接执行或者输入书上的命令,就会报错!在build文件夹下执行
./imageBasics ../ubuntu.png
输入指令后,执行效果如下图所示:
Ubuntu20.04和18.04都可以编译成功,我已经在两个版本上编译过!!!!
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/118848.html
摘要:代表第一章下的代表各章下的小细节内容。描述了李群的局部性质,是单位元附近的正交空间。否则,一个群可能存在多个李代数注意点旋转矩阵的导数,可以由旋转向量指定。误差项是将点的投影位置与观测位置做差,所以称为重投影误差。 1)代表第一章 1)下的1.2代表各章下的小细节内容。层次按1. ——1.1...
摘要:可以其中中的改为或,加快速度测试修改,将其中的改为放置数据集的地方,比如我的。我只保留了一个我下载的数据集对应的代码,其余的都删除了。最后运行然后结果就出来了待办事项在中调用深度相机上述相关配置的具体教程参考资料 ...
摘要:图和之间的关系图例与各版本之间的环境依赖关系的原装驱动并不支持,因此需要禁用掉并且重装卡官方驱动。会有很多同学在不知道的情况下安装了,最后导致和无法使用或者无法安装等问题。 ...
摘要:将拍摄到的图片拷贝到目录下,注意不要出现命名,其中为自然数字,否则图片有可能被覆盖。打开终端,执行讲图片名统一编号为自然数序列。 ROS环境下Android客户端...
摘要:视觉组接触的软件进行视觉开发会用到各种各样的软件开发环境辅助工具等,所以很有必要了解一些相关的快捷键命令使用技巧。没有这样保姆级的,并不存在一款能够自动为你生成的软件。一款录制屏幕的软件。 --NeoZng【neozng1@hnu.edu.cn】 3.视觉组接触的软件 进行视觉开发会用到...
阅读 2481·2023-04-25 18:06
阅读 2156·2021-11-22 09:34
阅读 1574·2021-11-08 13:16
阅读 1064·2021-09-24 09:47
阅读 1635·2021-09-02 15:34
阅读 2914·2019-08-30 15:44
阅读 2652·2019-08-29 17:24
阅读 2477·2019-08-23 18:37