opencv 学习笔记(2)

来源:互联网 发布:ios刷机软件 编辑:程序博客网 时间:2024/06/14 05:42

Fast 算法和harris算法

- Fast算法

#include "opencv2/opencv.hpp"#include"highgui.h"#include "iostream"using namespace std;using namespace cv;bool isdif(uchar a,uchar b){    if(abs(a-b)<10)        return false;    else        return true;}int  main(){    VideoCapture cap(0);    while (true) {        Mat frame;        cap>>frame;        /*         fast         */        Mat frame_rgb;        frame.copyTo(frame_rgb);        cvtColor(frame, frame, CV_64FC1);//        cout<<frame.at<uchar>(0,0); 变化的数字        int pos[4][2];//存放相对中心的绝对位置,4个点,每个点有x,y两个方向        pos[0][0]=0;        pos[0][1]=-3;        pos[1][0]=3;        pos[1][1]=0;        pos[2][0]=0;        pos[2][1]=3;        pos[3][0]=-3;        pos[3][1]=0;        for (int i=3; i<frame.rows-3; i++) {            for (int j=3; j<frame.cols-3; j++) {                int num=0;//记录有几个和中心角点不一样               uchar cen= frame.at<uchar>(i,j);//中心角点像素                for (int k=0; k<4; k++) {//看四个点加上绝对位置以后是否符合 fast算法规则                   uchar temp= frame.at<uchar>(i+pos[k][0],j+pos[k][1]);                    if (isdif(cen , temp)) {                        num++;                    }                }                if ((num==1) ||(num==3)||(num==4) ) {                  circle(frame_rgb,cvPoint(j,i),2,CV_RGB(255,0,0),2);//注意:i,j和 x,y相反                }            }        }}

- harris算法

/*         HARRIS         */        for (int i=1; i<frame.rows-1; i++) {            for (int j=1; j<frame.cols-1; j++) {                double IX,IY;                IX=frame.at<uchar>(i,j-1)-frame.at<uchar>(i,j+1);                IY=frame.at<uchar>(i-1,j)-frame.at<uchar>(i+1,j);                double R=IX * IX* IY*IY- 0.009*(IX*IX+IY*IY);//0.1为k值,一般范围为0.05到0.5 R大的时候即为角点//                cout<<R;                if (R>1000) {                    circle(frame_rgb, cvPoint(j,i), 1, CV_RGB(255,0,0));                }            }        }\

- 调用harris的API

        Mat con;        Mat cornerStrength;        cornerHarris(frame, cornerStrength, 2, 3, 0.1);        Mat harrisCorner;        threshold(cornerStrength, harrisCorner, 0.00001, 255, THRESH_BINARY);        imshow("frame", harrisCorner);        waitKey(10);
0 0
原创粉丝点击