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,這樣對圖像有些平移什麼的都不怎麼敏感了。
