1 基本的读写函数

cv::imread(filepath,loadflag)读取指定路径的图像文件,loadflag可设置为CV_LOAD_IMAGE_GRAYSCALE将读取的图片,转换为灰度图,缺省改参数默认以RGB方式加载。
cv::imwrite(filepath, file)
不同版本的OpenCV的imread具有不同的重载,这点有时会出现一些错误。
OpenCV的Mat提供直接访问图片像素的函数

  1. cv::Mat image = cv::imread(filepath)
  2. image.at<cv::Vec3b>(row,col)[0] = 0; //Blue, 图片为单通道时,类型为uchar
  3. image.at<cv::Vec3b>(row,col)[1] = 0; //Green
  4. image.at<cv::Vec3b>(row,col)[2] = 0; //Red

.at()出错,OpenCV学习笔记

2 图像基础处理函数

2.1 显示

error:(-215) size.width>0 && size.height>0 in function imshow().
Assertion failed (size.width>0 && size.height>0) in imshow
cv::imshow()
Assertion failed (scn == 1 && (dcn == 3 || dcn == 4)) in cvtColor
2021-05-13 10-46-14 的屏幕截图.png
发现一个奇怪的错误:

  1. void GetImageCallBack(const sensor_msgs::ImageConstPtr &ImgMsg)
  2. {
  3. //read
  4. cv_bridge::CvImageConstPtr image_ptr = cv_bridge::toCvCopy(ImgMsg, ImgMsg->encoding);
  5. ROS_INFO("Message Type is: %s",ImgMsg->encoding.c_str());
  6. //cv_bridge::CvImageConstPtr image_ptr = cv_bridge::toCvCopy(ImgMsg, sensor_msgs::image_encodings::BGR8);
  7. //cv_bridge::CvImageConstPtr image_ptr = cv_bridge::toCvCopy(ImgMsg, sensor_msgs::image_encodings::MONO8);
  8. ROS_INFO("Image Get!");
  9. cv::Mat Img = image_ptr -> image;
  10. //Img.convertTo(Img, CV_32FC1, 0.5);
  11. ROS_INFO("Image size: %d, Image cols: %d, Image rows: %d",Img.size, Img.cols, Img.rows);
  12. std::string path = "/home/yyh/文档/1.png";
  13. cv::imwrite(path, Img);
  14. cv::imshow("Image_test", Img);
  15. cv::waitKey(1);
  16. }

在上述程序中,一旦加入cv::imshow();会使得ROS_INFO输出的图像信息全部变成零,删除显示的语句后,又可以正常写入。
上面的不是错误,我以为ROS触发消息回调函数时都已经接收到数据了,所以陷入了一种比较狭隘的视角,后面测试发现传过来的第一张图都是空的,至于为啥,也没搞清楚。
转换

2.2 深度图转伪彩色图

cv::convertTo(depthImg, CV_32FC1, 1.0f/255);这里只是做的一个度量转换,不是转化为伪彩色图

2.3 cv_bridge

cv_bridge
图片对应的格式不一样。

2.4 提取矩形区域

cv::getRectSubPix(cv::_InputArray const&, cv::Size_<int>, cv::Point_<float>, cv::_OutputArray const& int)2021-05-30 14-23-35 的屏幕截图.png出现了received signal SIGSEGV, segmentation fault错误,
该错误主要有以下可能原因
Program received signal SIGSEGV, segmentation fault

  • 1.指针未初始化
  • 2.数组使用时,是否被初始化,数组下标是否越界,数组元素是否存在
  • 3.变量处理时变量的格式控制是否合理

段错误指访问的内存超出了系统给这个程序所设定的内存空间,例如访问了不存在的内存地址、访问了系统保护的内存地址、访问了只读的内存地址等。
Linux环境下段错误的调试解决办法

2.5 重映射 cv::remap()

openc中的重映射
重映射就是把一幅图像中某位置的像素放置到另一个图片指定位置的过程。

3. Mat 运算

参考链接: OpenCV报错:error: (-215:Assertion failed) type == B.type() in function ‘gemm’
cv::Mat A(3, 3, CV_64F),矩阵数据类型不一致导致的问题.

3.1 cv::Rect() 用法

openCV中cv::Rect矩形的用法

3.2 *\mul()\dot()

Opencv中矩阵相乘

4. 图像矫正

StereoRectify()函数定义及用法畸变矫正