#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
using namespace std;
using namespace cv;
//全局变量声明
Mat g_srcImage, g_srcGrayImage, g_dstImage;
//Canny相关变量
Mat g_cannyDetectedEdge;
int g_cannylowthreshold = 1;
//sobel相关变量
Mat g_sobelGraddient_x, g_sobelGraddient_y;
Mat g_sobelAbsGradent_x, g_sobelAbsGradent_y;
int g_sobelkernelsize = 1;
//scharr边缘检测相关变量
Mat g_scharrGradient_x, g_scharrGradient_y;
Mat g_scharrAbsGradient_x, g_scharrAbsGradient_y;
//轨迹条回调函数
static void on_Canny(int, void*);
static void on_Sobel(int, void*);
void Scharr();
int main(int argc,char** argv){
system("color 2F");
g_srcImage = imread("靶标原图.png");
if (!g_srcImage.data){
printf("打开图片错误,请检查路径\n");
return false;
}
namedWindow("原图窗口");
imshow("原图窗口", g_srcImage);
//创建与src同类型同大小的矩阵
g_dstImage.create(g_srcImage.size(), g_srcImage.type());
//将原图转为灰度图
cvtColor(g_srcImage, g_srcGrayImage, COLOR_BGR2GRAY);
namedWindow("Canny边缘检测",WINDOW_AUTOSIZE );
namedWindow("Sobel边缘检测", WINDOW_AUTOSIZE);
createTrackbar("参数值", "Canny边缘检测", &g_cannylowthreshold, 120, on_Canny);
createTrackbar("参数值", "Sobel边缘检测", &g_sobelkernelsize, 3,on_Sobel);
on_Canny(0, 0);
on_Sobel(0, 0);
Scharr();
while (char(waitKey(1)) != 'q')
{
}
return 0;
}
void on_Canny(int, void*){
//降噪
blur(g_srcGrayImage, g_cannyDetectedEdge, Size(3, 3));
//运行caany算子
Canny(g_cannyDetectedEdge, g_cannyDetectedEdge, g_cannylowthreshold, g_cannylowthreshold * 3, 3);
g_dstImage = Scalar::all(0);
g_srcImage.copyTo(g_dstImage, g_cannyDetectedEdge);
imshow("Canny边缘检测", g_dstImage);
}
void on_Sobel(int, void*){
//X方向梯度
Sobel(g_srcImage, g_sobelGraddient_x, CV_16S, 1, 0, (2 * g_sobelkernelsize + 1), 1, 1, BORDER_DEFAULT);
convertScaleAbs(g_sobelGraddient_x, g_sobelAbsGradent_x);
//Y方向梯度
Sobel(g_srcImage, g_sobelGraddient_y, CV_16S, 0, 1, (2 * g_sobelkernelsize + 1), 1, 1, BORDER_DEFAULT);
convertScaleAbs(g_sobelGraddient_y, g_sobelAbsGradent_y);
//合并梯度
addWeighted(g_sobelAbsGradent_x, 0.5, g_sobelAbsGradent_y, 0.5, 0, g_dstImage);
//显示效果图
imshow("Sobel边缘检测", g_dstImage);
}
void Scharr(){
//x方向梯度
Scharr(g_srcImage, g_scharrGradient_x, CV_16S, 1, 0, 1, 0,BORDER_DEFAULT);
convertScaleAbs(g_scharrGradient_x, g_scharrAbsGradient_x);
Scharr(g_srcImage, g_scharrGradient_y, CV_16S, 0, 1, 1, 0,BORDER_DEFAULT);
convertScaleAbs(g_scharrGradient_y, g_scharrAbsGradient_y);
addWeighted(g_scharrAbsGradient_x, 0.5, g_scharrAbsGradient_y, 0.5, 0, g_dstImage);
imshow("Scharr边缘检测",g_dstImage);
}