1. 程式人生 > >OpenCV角點檢測原始碼分析(Harris和ShiTomasi角點)

OpenCV角點檢測原始碼分析(Harris和ShiTomasi角點)

  1 #include <opencv2\opencv.hpp>
  2 #include <iostream>
  3 #include <string>
  4 
  5 using namespace std;
  6 
  7 #define HARRIS
  8 
  9 cv::RNG rng(12345);
 10 
 11 void calEigen2x2(cv::Mat cov,cv::Mat &eigenValue)
 12 {
 13     int height = cov.rows;
 14     int width = cov.cols;
15 16 float *pCov = (float*)cov.data; 17 float *pEigenValue = (float*)eigenValue.data; 18 for (int i = 0; i < height; i++) 19 { 20 for (int j = 0; j < width; j++) 21 { 22 double a = pCov[(i*width + j) * 3 + 0]; 23 double b = pCov[(i*width + j) * 3
+ 1]; 24 double c = pCov[(i*width + j) * 3 + 2]; 25 26 double tmp1 = (a + c) / 2.; 27 double tmp2 = sqrtf(b*b + (a - c)*(a - c) / 4.); 28 29 double alpha = tmp1 - tmp2; 30 double beta = tmp1 + tmp2; 31 32 pEigenValue[(i*width + j) * 2
+ 0] =(float) alpha; 33 pEigenValue[(i*width + j) * 2 + 1] =(float) beta; 34 } 35 } 36 } 37 38 void myCalEigenValues(cv::Mat srcImg, cv::Mat &eigenValue, int covWin, int sobelWin) 39 { 40 //求微分 41 cv::Mat sobelx, sobely; 42 cv::Sobel(srcImg, sobelx, CV_32FC1, 1, 0, sobelWin, 1. / (255*12), 0, 4); 43 cv::Sobel(srcImg, sobely, CV_32FC1, 0, 1, sobelWin, 1. / (255*12), 0, 4); 44 45 cv::Mat cov = cv::Mat::zeros(srcImg.size(), CV_32FC3); 46 int height = srcImg.rows; 47 int width = srcImg.cols; 48 float *pSobelX = (float*)sobelx.data; 49 float *pSobelY = (float*)sobely.data; 50 float *pCov = (float*)cov.data; 51 for (int i = 0; i < height; i++) 52 { 53 for (int j = 0; j < width; j++) 54 { 55 float dx = pSobelX[i*width + j]; 56 float dy = pSobelY[i*width + j]; 57 58 pCov[(i*width + j) * 3 + 0] = dx*dx; 59 pCov[(i*width + j) * 3 + 1] = dx*dy; 60 pCov[(i*width + j) * 3 + 2] = dy*dy; 61 } 62 } 63 64 cv::boxFilter(cov, cov, cov.depth(), cv::Size(covWin, covWin), cv::Point(-1, -1), false, 4); 65 66 calEigen2x2(cov, eigenValue); 67 } 68 69 void main() 70 { 71 string imgPath = "data/srcImg/0.png"; 72 cv::Mat srcImg = cv::imread(imgPath, 1); 73 cv::Mat grayImg; 74 cv::cvtColor(srcImg, grayImg, CV_BGR2GRAY); 75 int height = srcImg.rows; 76 int width = srcImg.cols; 77 78 cv::Mat eigenValue = cv::Mat::zeros(grayImg.size(), CV_32FC2); 79 int covWin = 3, sobelWin = 3; 80 myCalEigenValues(grayImg, eigenValue, covWin, sobelWin); 81 82 cv::Mat Mc = cv::Mat::zeros(grayImg.size(), CV_32FC1); 83 #ifndef HARRIS 84 //計算特徵表示式值 85 for (int i = 0; i<height; i++) 86 { 87 for (int j = 0; j < width; j++) 88 { 89 float alpha = eigenValue.at<float>(i, j*2+0); 90 float beta = eigenValue.at<float>(i, j*2+1); 91 92 Mc.at<float>(i, j) = alpha*beta - 0.04f*pow((alpha + beta), 2); 93 } 94 } 95 #else //ShiTomasi 96 for (int i = 0; i<height; i++) 97 { 98 for (int j = 0; j < width; j++) 99 { 100 float alpha = eigenValue.at<float>(i, j * 2 + 0); 101 float beta = eigenValue.at<float>(i, j * 2 + 1); 102 103 float minEigenValue = (alpha > beta) ? (beta) : (alpha); 104 105 Mc.at<float>(i, j) = minEigenValue; 106 } 107 } 108 #endif 109 110 double minVal, maxVal; 111 cv::minMaxLoc(Mc, &minVal, &maxVal, 0, 0, cv::Mat()); 112 113 double thresh = (maxVal + minVal) / 2.; 114 for (int i = 0; i < height; i++) 115 { 116 for (int j = 0; j < width; j++) 117 { 118 double value = (double)Mc.at<float>(i, j); 119 if (value > thresh) 120 { 121 cv::circle(srcImg, cv::Point(j, i), 4, cv::Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)), -1, 8, 0); 122 } 123 } 124 } 125 126 cv::namedWindow("show", 0); 127 cv::imshow("show", srcImg); 128 cv::waitKey(0); 129 }

相關推薦

OpenCV檢測原始碼分析HarrisShiTomasi

1 #include <opencv2\opencv.hpp> 2 #include <iostream> 3 #include <string> 4 5 using namespace std; 6 7 #define HARRIS

OpenCV檢測源代碼分析HarrisShiTomasi

mine res output 判斷 代數 void pos tar def OpenCV中常用的角點檢測為Harris角點和ShiTomasi角點。 以OpenCV源代碼文件 .\opencv\sources\samples\cpp\tutorial_code\Track

cornerSubPixel亞畫素檢測原始碼分析最小二乘法

OpenCV的中有cornerSubPixel()這個API函式用來針對初始的整數角點座標進行亞畫素精度的優化,該函式原型如下: C++: void cornerSubPix(InputArray image, InputOutputArray corners, Siz

opencv: 檢測原始碼分析

以下6個函式是opencv有關角點檢測的函式 ConerHarris, cornoerMinEigenVal,CornorEigenValsAndVecs, preConerDetect, conerSubPix, goodFeaturesToTracks, 其中, 前三個都呼叫靜態函式cornerEigen

SIFT特徵演算法原始碼分析opencv

SIFT特徵點演算法原始碼分析 SIFT演算法在opencv中被實現為一個類: SIFT ,主要的操作都在這個類過載的"()"運算子中實現。下面介紹這個類,以及其中呼叫的一些關鍵的函式。 SIFT類的建構函式:初始化演算法引數 SIFT::SIFT(int nfeatu

opencv影象特徵檢測及匹配harris,sift,surf,fast,breif,orb,BFmatch,FlannBasedMatcher

本文簡單概括各種演算法的提出背景及opencv實現,對具體原理不做討論一般而言,一個物體的角點最能夠代表物體的特徵,所以所謂的特徵檢測又叫角點(Corner)檢測harris是最早提出的特徵提取演算法:opencv實現如下:dst=cv2.cornerHarris(gray,

[px3][Android7.1]除錯筆記RK LCD顯示驅動分析fbscreen 部分程式

平臺 核心版本 安卓版本 px3 Linux3.0 Android7.1 檢視裝置: ls /sys/devices/platform

Harris檢測原理分析

http://blog.csdn.net/newthinker_wei/article/details/45603583 http://www.360doc.com/content/15/1212/23/20007814_519967668.shtml 本文將該文拷

OpenCV亞畫素cornerSubPixel()原始碼分析

  上一篇部落格中講到了goodFeatureToTrack()這個API函式能夠獲取影象中的強角點。但是獲取的角點座標是整數,但是通常情況下,角點的真實位置並不一定在整數畫素位置,因此為了獲取更為精確的角點位置座標,需要角點座標達到亞畫素(subPixel)精度。 1. 求取亞畫素精度的原理   找到一篇講

Harris檢測的實現cv::Mat && c++

原文連結或Google “A COMBINED CORNER AND EDGE DETECTOR”可以找到Harris角點檢測的論文。 簡單的概括一下,Harris角點檢測的原理為,通過計算論文中的R來判斷某一個畫素點是否為角點,通常情況下,當R為正數且較大時,該點為角點。

OpenCV學習筆記31KAZE 演算法原理與原始碼分析KAZE的原始碼優化及與SIFT的比較

  KAZE系列筆記: 1.  OpenCV學習筆記(27)KAZE 演算法原理與原始碼分析(一)非線性擴散濾波 2.  OpenCV學習筆記(28)KAZE 演算法原理與原始碼分析(二)非線性尺度空間構建 3.  Op

OpenCV學習筆記30KAZE 演算法原理與原始碼分析KAZE特徵的效能分析與比較

      KAZE系列筆記: 1.  OpenCV學習筆記(27)KAZE 演算法原理與原始碼分析(一)非線性擴散濾波 2.  OpenCV學習筆記(28)KAZE 演算法原理與原始碼分析(二)非線性尺度空間構

opencv(30)---特徵檢測與匹配1---SIFT特徵提取

基本概念 特徵點的檢測和匹配是計算機視覺中非常重要的技術之一, 在物體識別、視覺跟蹤、三維重建等領域都有很廣泛的應用。OpenCV提供瞭如下幾種特徵檢測方法: “FAST”——FastFeatureDetector “STAR”——StarFeatureD

Moravec檢測缺點分析

經過測試,可以發現moravec的眾多問題,重要的有:(1)它不具備旋轉不變性。(2)對邊緣點的反應比較強烈    moravec只計算了一些離散的偏移產生的灰度值變化(最多是8個方向),如圖下所示,旋轉之後,檢測到角點不一樣了。moravec統計的8個方向(最多是8個方向)是0°,45°,90°,135°,

第二人生原始碼分析3程式入口

#041         llwarns << "Our exception handler (" << (void *)LLWinDebug::handleException << ") replaced with " << prev_filter <&

Nacos Naming原始碼分析- 活躍檢測

臨時服務例項在註冊到naming server上之後,會週期性得傳送心跳資訊來保持節點的活躍。同時,naming server會週

轉載利用SIFTRANSAC算法openCV框架實現物體的檢測與定位,並求出變換矩陣findFundamentalMatfindHomography的比較 置頂

bsp 解釋 邊界 返回值 class 不同的 rip 很多 per 原文鏈接:https://blog.csdn.net/qq_25352981/article/details/46914837#commentsedit 本文目標是通過使用SIFT和RANSAC算

菜鳥帶你看原始碼——看不懂你打我ArrayList原始碼分析基於java 8

文章目錄 看原始碼並不難 軟體環境 成員變數: 構造方法 核心方法 get方法 remove方法 add方法 結束 看原始碼並不難 如何學好程式設計?如何寫出優質的程式碼?如

Android ADB 原始碼分析

前言 之前分析的兩篇文章 Android Adb 原始碼分析(一) 嵌入式Linux:Android root破解原理(二)   寫完之後,都沒有寫到相關的實現程式碼,這篇文章寫下ADB的通訊流程的一些細節 看這篇文章之前,請先閱讀 Linux的SOCKET

Mybatis 原始碼分析2—— 引數處理

Mybatis對引數的處理是值得推敲的,不然在使用的過程中對發生的一系列錯誤直接懵逼了。 以前遇到引數繫結相關的錯誤我就是直接給加@param註解,也稀裡糊塗地解決了,但是後來遇到了一些問題推翻了我的假設:單個引數不需要使用 @param 。由此產生了一個疑問,Mybatis到底是怎