前言
随着工业自动化、智能化的不断推进,机器视觉(2D/3D)在工业领域的应用和重要程度也同步激增(识别、定位、抓取、测量,缺陷检测等),而针对不同作业场景进行解决方案设计时,通常会借助PCL、OpenCV、Eigen等简单方便的开源算法库进行方案的快速验证和迭代以满足作业场景下的目标需求。
为了让对工业机器视觉方向感兴趣的同学能够少走一些弯路,故推出了此一系列简易入门教程示例,让初次使用者能够最简单直观地感受到当前所用算法模块的执行效果。
后续会逐步扩增与工业机器视觉相关的一些其它内容,如:
项目案例剖析、场景数据分析、基础算法模块、相机评测 等;
如有兴趣可加入群聊(若入群二维码被屏蔽,则可以通过Q群(1032861997)或评论、私信博主“群聊”,邀请入群),与同道同学及圈内同行一起交流讨论。
程序说明
展示sobel边缘检测效果;
输出结果
代码示例
/*
* @File: sobel_edge.cpp
* @Brief: opencv course
* @Description: 展示sobel边缘检测效果
* @Version: 0.0.1
* @Author: MuYv
*/
#include <iostream>
#include <string>
#include <opencv2/opencv.hpp>
int main(int argc, char** argv){
if(argc != 2){
std::cout<<"Usage: exec img_file_path"<<std::endl;
return -1;
}
const std::string kImgFilePath = argv[1]; // "../imgs/woman2.jpg"
// // 加载为 rgb 3通道彩色图数据
// cv::Mat img_src = cv::imread(kImgFilePath, cv::IMREAD_COLOR);
// 加载为灰度图数据
cv::Mat img_src = cv::imread(kImgFilePath, cv::IMREAD_GRAYSCALE);
cv::Mat img_edge, img_gray; //参数定义
cv::Mat grad_x, grad_y;
cv::Mat abs_grad_x, abs_grad_y,dst;
// 求 X方向梯度
cv::Sobel( img_src, grad_x, CV_16S, 1, 0, 3, 1, 1, cv::BORDER_DEFAULT );
cv::convertScaleAbs( grad_x, abs_grad_x );
cv::imshow("【效果图】 X方向Sobel", abs_grad_x);
// 求Y方向梯度
cv::Sobel( img_src, grad_y, CV_16S, 0, 1, 3, 1, 1, cv::BORDER_DEFAULT );
cv::convertScaleAbs( grad_y, abs_grad_y );
cv::imshow("【效果图】Y方向Sobel", abs_grad_y);
// 合并梯度(近似)
cv::addWeighted( abs_grad_x, 0.5, abs_grad_y, 0.5, 0, dst );
cv::imshow("【效果图】整体方向Sobel", dst);
cv::imshow("img_src", img_src);
// 等待n毫秒后关闭窗口,0代表一直开启,直到任意按键触发关闭窗口
cv::waitKey(0);
return 0;
}
总结
与canny边缘检测算法不同,如果待检测的边缘有较为明显的横纵特征,sobel的检测效果可能会更符合预期;
注:部分测试所用图片数据来源于网络,如有侵权,请联系博主删除,谢谢。