前言
随着工业自动化、智能化的不断推进,机器视觉(2D/3D)在工业领域的应用和重要程度也同步激增(识别、定位、抓取、测量,缺陷检测等),而针对不同作业场景进行解决方案设计时,通常会借助PCL、OpenCV、Eigen等简单方便的开源算法库进行方案的快速验证和迭代以满足作业场景下的目标需求。
为了让对工业机器视觉方向感兴趣的同学能够少走一些弯路,故推出了此一系列简易入门教程示例,让初次使用者能够最简单直观地感受到当前所用算法模块的执行效果。
后续会逐步扩增与工业机器视觉相关的一些其它内容,如:
项目案例剖析、场景数据分析、基础算法模块、相机评测 等;
如有兴趣可加入群聊(若入群二维码被屏蔽,则可以通过Q群(1032861997)或评论、私信博主“群聊”,邀请入群),与同道同学及圈内同行一起交流讨论。
程序说明
展示Mat类的简单用法;
输出结果
代码示例
/*
* @File: use_mat.cpp
* @Brief: opencv course
* @Description: 展示Mat类的简单用法
* @Version: 0.0.1
* @Author: MuYv
*/
#include <iostream>
#include <vector>
#include <opencv2/opencv.hpp>
int main(int argc, char** argv){
cv::Mat I = cv::Mat::eye(4, 4, CV_64F);
I.at<double>(1,1) = CV_PI;
std::cout << "\nI = " << I << ";\n" << std::endl;
cv::Mat r = cv::Mat(5, 3, CV_8UC3);
cv::randu(r, cv::Scalar::all(0), cv::Scalar::all(255));
std::cout << "r (OpenCV默认风格) = " << r << ";" << std::endl << std::endl;
std::cout << "r (Python风格) = " << cv::format(r, cv::Formatter::FMT_PYTHON) << ";\n" << std::endl;
std::cout << "r (Numpy风格) = " << cv::format(r, cv::Formatter::FMT_NUMPY)<< ";\n" << std::endl;
std::cout << "r (逗号分隔风格) = " << cv::format(r, cv::Formatter::FMT_CSV)<< ";\n" << std::endl;
std::cout << "r (C语言风格) = " << cv::format(r, cv::Formatter::FMT_C) << ";\n" << std::endl;
cv::Point2f p(6, 2); // (x, y)
std::cout << "【2维点】p = " << p << ";\n" << std::endl;
cv::Point3f p3f(8, 2, 0); // (x, y, z)
std::cout << "【3维点】p3f = " << p3f << ";\n" << std::endl;
std::vector<float> v;
v.push_back(3);
v.push_back(5);
v.push_back(7);
std::cout << "【基于Mat的vector】shortvec = " << cv::Mat(v) << ";\n"<<std::endl;
std::vector<cv::Point2f> points(10);
for (size_t i = 0; i < points.size(); ++i)
points[i] = cv::Point2f((float)(i * 5), (float)(i % 7));
std::cout << "【二维点向量】points = " << points<<";"<<std::endl;
getchar();//按任意键退出
return 0;
}
总结
cv::Mat为模板类,如果是在上下游分离的两个串行流程中使用同一份cv::Mat对象数据时,需注意元素数据类型一致及默认初始化内容;
常用作图像处理中的mask遮罩、深度图(depth)存储容器;
注:部分测试所用图片数据来源于网络,如有侵权,请联系博主删除,谢谢。