(一)接下来会用到的几个函数:
1、归一化:normalize 函数介绍
void normalize(InputArray src,OutputArraydst, double alpha = 1, double beta = 0, intnorm_type = NORM_L2, int dtype = -1, InputArray mask = noArray() )
该函数归一化输入数组使它的范数或者数值范围在一定的范围内。
src:? 输入数组
dst:?输出数组,支持原地运算
alpha:?range normalization模式的最小值
beta :range normalization模式的最大值。
normType:归一化的类型,可以有以下的取值:
?NORM_MINMAX:数组的数值被平移或缩放到一个指定的范围,线性归一化,一般较常用。
?NORM_INF:此类型的定义没有查到,根据OpenCV 1的对应项,可能是归一化数组的C-范数(绝对值的最大值)
??NORM_L1 : ?归一化数组的L1-范数(绝对值的和)
??NORM_L2: 归一化数组的(欧几里德)L2-范数
dtype:dtype为负数时,输出数组的type与输入数组的type相同;
否则,输出数组与输入数组只是通道数相同,而tpye=CV_MAT_DEPTH(dtype).
2、convertScaleAbs()用于实现对整个图像数组中的每一个元素,该操作可实现图像增强等相关操作的快速运算。
void? convertScaleAbs(InputArray src, // 输入数组OutputArray dst, // 输出数组double alpha = 1.0, // 乘数因子 double beta = 0.0 // 偏移量)
(二)角点检测
角点检测函数?cornerHarris(InputArray src, // 输入8bit单通道灰度Mat矩阵 ?? ??? ??? ??? ??? ?OutputArray dst, // 用于保存harris角点检测结果 ?? ??? ??? ??? ??? ?int blockSize, // 滑块窗口的尺寸 ?? ??? ??? ??? ??? ?int ksize, // sobel边缘检测滤波器大小 ?? ??? ??? ??? ??? ?double k, // harris中间参数,经校验0.04-0.06 ?? ??? ??? ??? ??? ?int borderType = BORDER_DEFAULT); // 插值类
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
Mat src, gray_src;
int thresh = 130;
int max_count = 255;
const char* output_title = "HarrisCornerDetectionResult";
void Harris_Dome(int, void*);
int main()
{
src = imread("D://RM//OpenCv的学习//相机标定和角点检测//22.jpg");
if (src.empty())
{
printf("没有发现图片!!!");
return -1;
}
namedWindow("Input image", WINDOW_AUTOSIZE);
imshow("Input image", src);
namedWindow(output_title, WINDOW_AUTOSIZE);//设置窗口大小
cvtColor(src, gray_src, COLOR_BGR2GRAY);//原图转换为灰度图
createTrackbar("Threshold", output_title, &thresh, max_count, Harris_Dome);//创建滑动条
Harris_Dome(0, 0);
waitKey(0);
return 0;
}
//角点检测函数
void Harris_Dome(int, void*)
{
Mat dst, norm_dst, normScaleDsr;
dst = Mat::zeros(gray_src.size(), CV_32FC1);
int blockSize = 2;
int Ksize = 3;
double k = 0.04;
cornerHarris(gray_src, dst, blockSize, Ksize, k, BORDER_DEFAULT);
normalize(dst, norm_dst, 0, 255, NORM_MINMAX, CV_32FC1, Mat());//归一化
convertScaleAbs(norm_dst, normScaleDsr);
Mat resultImg = src.clone();
for (int row = 0; row < resultImg.rows; row++)
{
uchar* currenrRow = normScaleDsr.ptr(row);
for (int col = 0; col < resultImg.cols; col++)
{
int value = (int)*currenrRow;
if (value > thresh)
{
circle(resultImg, Point(col, row), 2, Scalar(0, 0, 255), 2, 8, 0);
}
currenrRow++;
}
}
imshow(output_title, resultImg);
}
|