opencv中的演算法
『壹』 opencv中目標跟蹤的演算法有哪些
是對MeanShift演算法的改進演算法,可以在跟蹤的過程中隨著目標大小的變化實時調整搜索窗口大小,對於視頻序列中的每一幀還是採用MeanShift來尋找最優迭代結果,至於如何實現自動調整窗口大小的,
『貳』 opencv中有沒有實現ostu演算法
沒有 需要自己寫函數 比如:
int Otsu(IplImage* src)
{
int height=src->height;
int width=src->width;
long size = height * width;
//histogram
float histogram[256] = {0};
for(int m=0; m < height; m++)
{
unsigned char* p=(unsigned char*)src->imageData + src->widthStep * m;
for(int n = 0; n < width; n++)
{
histogram[int(*p++)]++;
}
}
int threshold;
long sum0 = 0, sum1 = 0; //存儲前景的灰度總和和背景灰度總和
long cnt0 = 0, cnt1 = 0; //前景的總個數和背景的總個數
double w0 = 0, w1 = 0; //前景和背景所佔整幅圖像的比例
double u0 = 0, u1 = 0; //前景和背景的平均灰度
double variance = 0; //最大類間方差
int i, j;
double u = 0;
double maxVariance = 0;
for(i = 1; i < 256; i++) //一次遍歷每個像素
{
sum0 = 0;
sum1 = 0;
cnt0 = 0;
cnt1 = 0;
w0 = 0;
w1 = 0;
for(j = 0; j < i; j++)
{
cnt0 += histogram[j];
sum0 += j * histogram[j];
}
u0 = (double)sum0 / cnt0;
w0 = (double)cnt0 / size;
for(j = i ; j <= 255; j++)
{
cnt1 += histogram[j];
sum1 += j * histogram[j];
}
u1 = (double)sum1 / cnt1;
w1 = 1 - w0; // (double)cnt1 / size;
u = u0 * w0 + u1 * w1; //圖像的平均灰度
printf("u = %f\n", u);
//variance = w0 * pow((u0 - u), 2) + w1 * pow((u1 - u), 2);
variance = w0 * w1 * (u0 - u1) * (u0 - u1);
if(variance > maxVariance)
{
maxVariance = variance;
threshold = i;
}
}
printf("threshold = %d\n", threshold);
return threshold;
}
『叄』 求基於OpenCV的三幀差分演算法代碼
Detector虛類):實現前景檢測,
2.團塊檢測模塊(CvBlobDetector虛類):實現運動物體(團塊)的的檢測
3.團塊跟蹤模塊(CvBlobTracker虛類):實現運動物體跟蹤
4.團塊運動軌跡產生模塊(CvBlobTrackGen虛類):實現的功能與模塊名字同(下同)
5.團塊軌跡後處理模塊(CvBlobTrackPostProc虛類)
6.團塊軌跡分析模塊(CvBlobTrackAnalysis虛類)
7.以及處理流程模塊(cvBlobTrackerAuto虛類):此模塊可看成膠水,集成上面的模塊。
除了處理流程模塊(因為它只控制流程呀~),每一個模塊可以用多種演算法實現,在程序中,這些演算法就是函數。如(15-16行):
CvFGDetector* cvCreateFGDetector0()
CvFGDetector* cvCreateFGDetector0Simple()
CvFGDetector* cvCreateFGDetector1()
也就是說這三個函數都是能完成前景檢測,具體用哪個,由你在main()函數中調用。
其他模塊也是這樣。
實現這些模塊的類以及完成這些演算法的函數都由OPENCV幫你實現了,blobtrack要做的就是在main()函數中調用這些函數,初始化函數參數以及各種變數。
『肆』 Opencv SIFT演算法
建立一個新工程,將match.c文件加進去,然後一個一個文件加。提示少那個就加哪個。
匹配用的就是match里的內容。
『伍』 opencv中是否有kmeans演算法
這個肯定有啊,看看opencv裡面的kmeans()函數
『陸』 opencv 中自帶的模板匹配演算法出處
方法如下:
使用OPENCV下SIFT庫做圖像匹配的常式
// opencv_empty_proj.cpp : 定義控制台應用程序的入口點。
//
#include "stdafx.h"
#include <opencv2/opencv.hpp>
#include <opencv2/features2d/features2d.hpp>
#include<opencv2/nonfree/nonfree.hpp>
#include<opencv2/legacy/legacy.hpp>
#include<vector>
using namespace std;
using namespace cv;
int _tmain(int argc, _TCHAR* argv[])
{
const char* imagename = "img.jpg";
//從文件中讀入圖像
Mat img = imread(imagename);
Mat img2=imread("img2.jpg");
//如果讀入圖像失敗
if(img.empty())
{
fprintf(stderr, "Can not load image %s\n", imagename);
return -1;
}
if(img2.empty())
{
fprintf(stderr, "Can not load image %s\n", imagename);
return -1;
}
//顯示圖像
imshow("image before", img);
imshow("image2 before",img2);
//sift特徵檢測
SiftFeatureDetector siftdtc;
vector<KeyPoint>kp1,kp2;
siftdtc.detect(img,kp1);
Mat outimg1;
drawKeypoints(img,kp1,outimg1);
imshow("image1 keypoints",outimg1);
KeyPoint kp;
vector<KeyPoint>::iterator itvc;
for(itvc=kp1.begin();itvc!=kp1.end();itvc++)
{
cout<<"angle:"<<itvc->angle<<"\t"<<itvc->class_id<<"\t"<<itvc->octave<<"\t"<<itvc->pt<<"\t"<<itvc->response<<endl;
}
siftdtc.detect(img2,kp2);
Mat outimg2;
drawKeypoints(img2,kp2,outimg2);
imshow("image2 keypoints",outimg2);
SiftDescriptorExtractor extractor;
Mat descriptor1,descriptor2;
BruteForceMatcher<L2<float>> matcher;
vector<DMatch> matches;
Mat img_matches;
extractor.compute(img,kp1,descriptor1);
extractor.compute(img2,kp2,descriptor2);
imshow("desc",descriptor1);
cout<<endl<<descriptor1<<endl;
matcher.match(descriptor1,descriptor2,matches);
drawMatches(img,kp1,img2,kp2,matches,img_matches);
imshow("matches",img_matches);
//此函數等待按鍵,按鍵盤任意鍵就返回
waitKey();
return 0;
}
『柒』 opencv中怎麼調用ransac演算法
對閾值的選擇: 當兩幅圖像的SIFT特徵向量生成後,下一步我們採用關鍵點特徵向量的歐式距離來作為 兩幅圖像中關鍵點的相似性判定度量。取圖像1中的某個關鍵點,並找出其與圖像2中歐式距離最近的前兩個關鍵點,在這兩個關鍵點中,如果最近的距離