opencv演算法
㈠ 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人臉檢測演算法
我用攝像頭打開480x640的窗口,然後使用OpenCV的人臉檢測函數cvHaarDetectObjects進行人臉檢測。函數配置如下:
faces = cvHaarDetectObjects( detectImg, (CvHaarClassifierCascade*)cascade, storage, search_scale_factor, 3, flags, minFeatureSize );
其中, search_scale_factor是1.1, flags = CV_HAAR_FIND_BIGGEST_OBJECT | CV_HAAR_DO_ROUGH_SEARCH; 也就是說只找一張人臉。 minFeatureSize是(20,20)。
這樣的配置在有人臉的情況下可以實時檢測,大概就是十幾ms的樣子
㈢ opencv演算法怎麼實現八鄰域的標記
用cvRectangle()函數。
OpenCV裡面的繪圖函數函數功能: 通過對角線上的兩個頂點繪制簡單、指定粗細或者帶填充的矩形函數原型:void cvRectangle( CvArr* img, CvPoint pt1, CvPoint pt2, CvScalar color,int thickness=1, int line_type=8, int shift=0 );參數介紹:img -- 圖像.pt1 -- 矩形的一個頂點。pt2 -- 矩形對角線上的另一個頂點color -- 線條顏色 (RGB) 或亮度(灰度圖像 )(grayscale image)。thickness -- 組成矩形的線條的粗細程度。取負值時(如 CV_FILLED)函數繪制填充了色彩的矩形。line_type -- 線條的類型。見cvLine的描述shift -- 坐標點的小數點位數。
㈣ 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檢測缺陷用哪些演算法
根據不同的需求來進行不同的處理
1 空洞 這個肯定是像素顏色和周邊的不同 建議用閾值分割 然後輪廓檢測
2 褶皺 這個褶皺肯定會有梯度的變化 建議檢測邊緣 再計算褶皺的梯度信息
3 劃痕 這個和上一個問題相似 但是也有不同 應該是梯度的方向和強度不同(一個是凹一個是凸)
4 斑點 如果只是點點星星的 opencv里也有很多角點檢測演算法 比如 surf fast ORB等
㈥ 求基於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中使用層次聚類演算法
如何在opencv中使用層次聚類演算法
Invalidate只是放一個WM_PAINT消息在隊列里,不做別的,所以只有當當前函數返回後,進入消息循環,取出WM_PAINT,才執行PAINT,所以不管Invalidate放哪裡,都是最後的。
InvalidateRect(hWnd,&rect,TRUE);向hWnd窗體發出WM_PAINT的消息,強制客戶區域重繪制,
rect是你指定要刷新的區域,此區域外的客戶區域不被重繪,這樣防止客戶區域的一個局部的改動,而導致整個客戶區域重繪而導致閃爍,如果最後的參數為TRUE,則還向窗體發送WM_ERASEBKGND消息,使背景重繪,當然在客戶區域重繪之前。
㈧ 如何使用opencv中的NCC演算法實現兩幅圖像的相似性判斷
感測器是一種檢測裝置,能感受到被測量的信息,並能將感受到的信息,按一定規律變換成為電信號或其他所需形式的信息輸出,以滿足信息的傳輸、處理、存儲、顯示、記錄和控制等要求。
感測器的特點包括:微型化、數字化、智能化、多功能化、系統化、網路化。它是實現自動檢測和自動控制的首要環節。感測器的存在和發展,讓物體有了觸覺、味覺和嗅覺等感官,讓物體慢慢變得活了起來。通常根據其基本感知功能分為熱敏元件、光敏元件、氣敏元件、力敏元件、磁敏元件、濕敏元件、聲敏元件、放射線敏感元件、色敏元件和味敏元件等十大類。
㈨ opencv大部分演算法使用了GPU嗎
OpenCV的一些函數,如SURF,OpticalFlow,houghlines,提供了GPU加速版本,但是使用起來挺麻煩的,而且貌似效果沒有宣傳的那麼好,你的這個程序應該是無GPU的。
㈩ opencv關於像素點的圖像匹配演算法
首先,建議你將圖像中感興趣區域(比如上圖中的字母)取出來進行歸一化,然後在進行匹配率計算。這是因為周圍環境會對匹配率產生影響。
其次,建議你將匹配率演算法改成Hausdorff距離https://en.wikipedia.org/wiki/Hausdorff,這樣對圖像有些平移什麼的都不怎麼敏感了。