OpenCV

Stella981
• 阅读 317

opencv-自定义harris角点检测

关于harris角点检测的原理以及matlab版本,请移步https://www.cnblogs.com/klitech/p/5779600.html

小白初学,这里采用opencv实现之,把自己遇到的疑问一一表述出来,以备后用。

疑问1. CV_32FC1,CV_32FC(6)是什么意思?

   CV_<bit_depth>(S|U|F)C<number_of_channels>

    • bit_depth,可取的值为8,16,32,64.它表示一个像素所占用的bite数
    • S|U|F, S--- signed int,  U--- unsigned int,  F---float
    • C<number_of_channels> 通道数,灰度图像取值1,rgb图像取值3

疑问2. Mat::zeros的两种初始化

  • Mat::zeros(int rows, int cols, int type)
  • Mat::zeros(Size size,int type)

第一种形式,返回特定尺寸与类型的零矩阵,比如  Mat A = Mat::zeros(3,3,CV_32FC1);

第二种形式,程序中采用的方式,Mat::zeros(src.size(), CV_32FC(6));

我的理解是这两种形式实质一样

疑问3. cornerEigenValsAndVecs()使用方法

   函数原型, cornerEigenValsAndVecs( InputArray src, OutputArray dst,

int blockSize, int ksize,

int borderType = BORDER_DEFAULT );

  • src 图像类型应该为单通道,或者float
  • dst 图像类型应该为CV_32FC(6),包含2个特征值,以及对应的2个2维向量,总计6个结果。
  • blocksize 邻域大小
  • ksize 函数采用sobel算子
  • borderType 取默认BORDER_DEFAULT

函数调用参看后面的程序。

 1 #include <opencv2/opencv.hpp>
 2 #include <iostream>
 3 #include <math.h>
 4 using namespace cv;
 5 using namespace std;
 6 Mat src, gray_src;
 7 Mat harris_dst, harrisRspImg;
 8 double harris_min_rsp;
 9 double harris_max_rsp;
10 int qualityLevel = 30;
11 const char* harris_win = "Custom Harris Corners Dector";
12 int max_count = 100;
13 void CustomHarris_Demo(int, void *);
14 
15 int main()
16 {
17 
18     src = imread("D:/1.png");
19     if (src.empty())
20     {
21         cout << "could not load image..." << endl;
22         return -1;
23     }
24     namedWindow("input_image", CV_WINDOW_AUTOSIZE);
25     imshow("input_image", src);
26     cvtColor(src, gray_src, COLOR_BGR2GRAY);
27     // 计算特征值
28     int blockSize = 3;
29     int ksize = 3;
30     double k = 0.04;
31 
32     harris_dst = Mat::zeros(src.size(), CV_32FC(6)); //6通道
33     harrisRspImg = Mat::zeros(src.size(), CV_32FC1);
34     cornerEigenValsAndVecs(gray_src, harris_dst, blockSize, ksize, 4);
35     //计算响应
36     for (int row = 0; row < harris_dst.rows; row++)
37     {
38         for (int col = 0; col < harris_dst.cols; col++)
39         {
40             double lambda1 = harris_dst.at<Vec6f>(row, col)[0];
41             double lambda2 = harris_dst.at<Vec6f>(row, col)[1];
42             harrisRspImg.at<float>(row, col) = lambda1 * lambda2 - k*pow((lambda1 + lambda2), 2);
43         }
44     }
45     minMaxLoc(harrisRspImg, &harris_min_rsp, &harris_max_rsp, 0, 0, Mat());//求最大最小响应
46     namedWindow(harris_win, CV_WINDOW_AUTOSIZE);
47     createTrackbar("Quality Value", harris_win, &qualityLevel, max_count, CustomHarris_Demo);
48     CustomHarris_Demo(0, 0);
49     waitKey(0);
50     return 0;
51 }
52 void CustomHarris_Demo(int, void*) {
53     if (qualityLevel < 10) {
54         qualityLevel = 10;
55     }
56     Mat resultImg = src.clone();
57     float t = harris_min_rsp + (((double)qualityLevel) / max_count)*(harris_max_rsp - harris_min_rsp);
58     for (int row = 0; row < src.rows; row++) {
59         for (int col = 0; col < src.cols; col++) {
60             float v = harrisRspImg.at<float>(row, col);
61             if (v > t) {
62                 circle(resultImg, Point(col, row), 2, Scalar(0, 0, 255), 2, 8, 0);
63             }
64         }
65     }
66 
67     imshow(harris_win, resultImg);
68 }
点赞
收藏
评论区
推荐文章
刚刚好 刚刚好
4个月前
css问题
1、在IOS中图片不显示(给图片加了圆角或者img没有父级)<div<imgsrc""/</divdiv{width:20px;height:20px;borderradius:20px;overflow:h
blmius blmius
1年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
晴空闲云 晴空闲云
4个月前
css中box-sizing解放盒子实际宽高计算
我们知道传统的盒子模型,如果增加内边距padding和边框border,那么会撑大整个盒子,造成盒子的宽度不好计算,在实务中特别不方便。boxsizing可以设置盒模型的方式,可以很好的设置固定宽高的盒模型。盒子宽高计算假如我们设置如下盒子:宽度和高度均为200px,那么这会这个盒子实际的宽高就都是200px。但是当我们设置这个盒子的边框和内间距的时候,那
艾木酱 艾木酱
3个月前
快速入门|使用MemFire Cloud构建React Native应用程序
MemFireCloud是一款提供云数据库,用户可以创建云数据库,并对数据库进行管理,还可以对数据库进行备份操作。它还提供后端即服务,用户可以在1分钟内新建一个应用,使用自动生成的API和SDK,访问云数据库、对象存储、用户认证与授权等功能,可专
Stella981 Stella981
1年前
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解2016年09月02日00:00:36 \牧野(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fme.csdn.net%2Fdcrmg) 阅读数:59593
Stella981 Stella981
1年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
1年前
MySQL查询按照指定规则排序
1.按照指定(单个)字段排序selectfromtable_nameorderiddesc;2.按照指定(多个)字段排序selectfromtable_nameorderiddesc,statusdesc;3.按照指定字段和规则排序selec
Stella981 Stella981
1年前
Angular material mat
IconIconNamematiconcode_add\_comment_addcommenticon<maticonadd\_comment</maticon_attach\_file_attachfileicon<maticonattach\_file</maticon_attach\
Wesley13 Wesley13
1年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
helloworld_28799839 helloworld_28799839
4个月前
常用知识整理
Javascript判断对象是否为空jsObject.keys(myObject).length0经常使用的三元运算我们经常遇到处理表格列状态字段如status的时候可以用到vue
helloworld_34035044 helloworld_34035044
6个月前
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为