日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HuMoments函数

發(fā)布時間:2025/4/16 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HuMoments函数 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、-------------------------------------------------------------------HuMoments函數(shù)-------------------------------------------------------------------------------------------

1、函數(shù)作用:

利用圖像的矩,計算出圖像的不變矩,,,,,,圖像的不變矩不會因為圖像的旋轉 、縮放 、鏡像而變化

通常用于圖像的識別,,,,這是圖像保持不變的一個特征。

圖像矩的公式:

Hu矩是從中心矩中計算得到。即七個由歸一化中心矩組合成的矩:??

?其中中心矩和歸一化中心矩的定義為:

?

?

在c語言中:

?? 我們可以使用cvContoursMoments函數(shù)、cvMoments函數(shù)方便的得到輪廓的矩集,然后再相應的方法或函數(shù)獲取各種矩。
??? 特定的矩:cvGetSpatialMoment函數(shù)
??? 中心矩:cvGetCentralMoment函數(shù)
??? 歸一化中心矩:cvGetNormalizedCentralMoment函數(shù)
??? Hu矩:cvGetHuMoments函數(shù)

2、函數(shù)形式

C++:?void?HuMoments(const Moments&?m, OutputArray?hu)

C++:?void?HuMoments(const Moments&?moments, double?hu[7])

參數(shù)詳解:

const Moments&?m:第一個參數(shù)是圖像的矩

?OutputArray?hu:輸出的圖像的不變矩


3、opencv代碼

#include <cv.h> #include <cxcore.h> #include <highgui.h> #include <cvaux.h> #include <iostream> #include <string> #include <strstream> #include <iomanip> #include <cmath> using namespace std;void imRotate(IplImage *src,IplImage *dst,double angle , CvPoint2D32f center,double scale = 1 );int main() {time_t StartTime = clock();IplImage *src = cvLoadImage("f:\\images\\test1.bmp",CV_LOAD_IMAGE_GRAYSCALE);cvShowImage("src",src);CvMemStorage *storage = cvCreateMemStorage();CvSeq *contour = NULL;CvRNG rng = cvRNG(-1);while(1){double scalar = cvRandReal(&rng)*0.8;if(scalar < 0.3 )continue;double angle = cvRandReal(&rng)*360;IplImage *dst = cvCreateImage(cvSize(src->width,src->height),8,1);imRotate(src,dst,angle,cvPoint2D32f(src->width/2,src->height/2),scalar);cvShowImage("dst",dst);cvThreshold(dst,dst,100,255,CV_THRESH_BINARY);cvFindContours(dst,storage,&contour);CvMoments moments;CvHuMoments huMoments;cvMoments(dst,&moments,1);cvGetHuMoments(&moments, &huMoments);cout<<"("<<setprecision(3)<<dec<<scalar<<")"<<" ";for(int i = 0;i<7;++i){cout<<setiosflags(ios::scientific)<<setprecision(4)<<((double*)&huMoments)[i]<<' ';}cout<<endl;cvReleaseImage(&dst);cvClearSeq(contour);if(cvWaitKey() == 27)break;}time_t EndTime = clock();cout<<double(EndTime - StartTime)/CLOCKS_PER_SEC<<endl; }void imRotate(IplImage *src, IplImage *dst,double angle , CvPoint2D32f center,double scale) {assert(src->width == dst->width && src->height == dst->height &&src->depth == dst->depth &&src->nChannels == dst->nChannels);CvMat *mapMatrix = cvCreateMat(2,3,CV_32FC1);cv2DRotationMatrix(center,angle,scale,mapMatrix); //旋轉縮放為仿射變換,此處求變換矩陣cvWarpAffine(src,dst,mapMatrix); }

相似性準則

①法一

// 計算相似度1 double dbR =0; //相似度 double dSigmaST =0;double dSigmaS =0;double dSigmaT =0;double temp =0; {for(int i=0;i<7;i++){temp = fabs(Sa[i]*Ta[i]);dSigmaST+=temp;dSigmaS+=pow(Sa[i],2);dSigmaT+=pow(Ta[i],2);}}dbR = dSigmaST/(sqrt(dSigmaS)*sqrt(dSigmaT));

②法二?

1 // 計算相似度2 2 double dbR2 =0; //相似度 3 double temp2 =0; 4 double temp3 =0; 5 {for(int i=0;i<7;i++) 6 { 7 temp2 += fabs(Sa[i]-Ta[i]); 8 temp3 += fabs(Sa[i]+Ta[i]); 9 }} 10 dbR2 =1- (temp2*1.0)/(temp3);


總結

以上是生活随笔為你收集整理的HuMoments函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。