图像特征提取的总结

来源:互联网 发布:女生必知防身方法 编辑:程序博客网 时间:2024/05/01 15:27

图像特征提取代码集合

目录:

1,颜色提取

2,形状提取

3,角点提取

4,hough直线提取

5,hough圆提取

6,hough矩形提取

7,边缘直方图提取

8,视频流中边缘检测

9,纹理提取


1,颜色提取

颜色直方图提取:

#include <cv.h>
#include <highgui.h>
#include <iostream>
using namespace std;
 
 int main( int argc, char** argv )
{
IplImage * src= cvLoadImage("f.jpg",1);
 
IplImage* hsv = cvCreateImage( cvGetSize(src), 8, 3 );
IplImage* h_plane = cvCreateImage( cvGetSize(src), 8, 1 );
IplImage* s_plane = cvCreateImage( cvGetSize(src), 8, 1 );
IplImage* v_plane = cvCreateImage( cvGetSize(src), 8, 1 );
IplImage* planes[] = { h_plane, s_plane };
 
/** H 分量划分为16个等级,S分量划分为8个等级*/
int h_bins = 16, s_bins = 8;
int hist_size[] = {h_bins, s_bins};
 
/** H 分量的变化范围*/
float h_ranges[] = { 0, 180 }; 
 
/** S 分量的变化范围*/
float s_ranges[] = { 0, 255 };
float* ranges[] = { h_ranges, s_ranges };
 
/** 输入图像转换到HSV颜色空间*/
cvCvtColor( src, hsv, CV_BGR2HSV );
cvCvtPixToPlane( hsv, h_plane, s_plane, v_plane, 0 );
 
/** 创建直方图,二维, 每个维度上均分*/
CvHistogram * hist = cvCreateHist( 2, hist_size, CV_HIST_ARRAY, ranges, 1 );
/** 根据H,S两个平面数据统计直方图*/
cvCalcHist( planes, hist, 0, 0 );
 
/** 获取直方图统计的最大值,用于动态显示直方图*/
float max_value;
cvGetMinMaxHistValue( hist, 0, &max_value, 0, 0 );
 
/** 设置直方图显示图像*/
int height = 240;
int width = (h_bins*s_bins*6);
IplImage* hist_img = cvCreateImage( cvSize(width,height), 8, 3 );
cvZero( hist_img );
 
/** 用来进行HSV到RGB颜色转换的临时单位图像*/
IplImage * hsv_color = cvCreateImage(cvSize(1,1),8,3);
IplImage * rgb_color = cvCreateImage(cvSize(1,1),8,3);
int bin_w = width / (h_bins * s_bins);
for(int h = 0; h < h_bins; h++)
{
for(int s = 0; s < s_bins; s++)
{
int i = h*s_bins + s;
/** 获得直方图中的统计次数,计算显示在图像中的高度*/
float bin_val = cvQueryHistValue_2D( hist, h, s );
int intensity = cvRound(bin_val*height/max_value);
 
/** 获得当前直方图代表的颜色,转换成RGB用于绘制*/
cvSet2D(hsv_color,0,0,cvScalar(h*180.f / h_bins,s*255.f/s_bins,255,0));
cvCvtColor(hsv_color,rgb_color,CV_HSV2BGR);
CvScalar color = cvGet2D(rgb_color,0,0);
 
cvRectangle( hist_img, cvPoint(i*bin_w,height),
cvPoint((i+1)*bin_w,height - intensity),
color, -1, 8, 0 );
}
}
 
cvNamedWindow( "Source", 1 );
cvShowImage( "Source", src );
 
cvNamedWindow( "H-S Histogram", 1 );
cvShowImage( "H-S Histogram", hist_img ); 
cvWaitKey(0);
}




2,形状提取

Candy算子对边缘提取:

#include "cv.h"
#include "cxcore.h"
#include "highgui.h" 
int main( int argc, char** argv ) 
{
    //声明IplImage指针
         IplImage* pImg = NULL; 
    IplImage* pCannyImg = NULL; 
    //载入图像,强制转化为Gray
pImg = cvLoadImage( "result.bmp", 0); 
//为canny边缘图像申请空间
pCannyImg = cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U, 1);
//canny边缘检测
cvCanny(pImg, pCannyImg, 50, 150, 3); 
//创建窗口
cvNamedWindow("src", 1);
cvNamedWindow("canny",1);
//显示图像
cvShowImage( "src", pImg ); 
cvShowImage( "canny", pCannyImg ); 

//等待按键
cvWaitKey(0);
//销毁窗口
cvDestroyWindow( "src" ); 
cvDestroyWindow( "canny" );
//释放图像
cvReleaseImage( &pImg ); 
cvReleaseImage( &pCannyImg );
return 0;




3,角点提取:

#include <stdio.h>
#include "cv.h"
#include "highgui.h"
#define MAX_CORNERS 100
int main(void)
{
int cornersCount=MAX_CORNERS;//得到的角点数目
CvPoint2D32f corners[MAX_CORNERS];//输出角点集合
IplImage *srcImage = 0,*grayImage = 0,*corners1 = 0,*corners2 = 0;
int i;
CvScalar color = CV_RGB(255,0,0);
cvNamedWindow("image",1);
//Load the image to be processed
srcImage = cvLoadImage("f.jpg",1);
grayImage = cvCreateImage(cvGetSize(srcImage),IPL_DEPTH_8U,1);
//copy the source image to copy image after converting the format
//复制并转为灰度图像
cvCvtColor(srcImage,grayImage,CV_BGR2GRAY);
//create empty images os same size as the copied images
//两幅临时位浮点图像,cvGoodFeaturesToTrack会用到
corners1 = cvCreateImage(cvGetSize(srcImage),IPL_DEPTH_32F,1);
corners2 = cvCreateImage(cvGetSize(srcImage),IPL_DEPTH_32F,1);
cvGoodFeaturesToTrack(grayImage,corners1,corners2,corners,&cornersCount,0.05,
30,//角点的最小距离是
0,//整个图像
3,0,0.4);
printf("num corners found: %d\n",cornersCount);
//开始画出每个点
if (cornersCount>0)
{
for (i=0;i<cornersCount;i++)
{
cvCircle(srcImage,cvPoint((int)(corners[i].x),(int)(corners[i].y)),2,color,2,CV_AA,0);
}
}
cvShowImage("image",srcImage);
cvSaveImage("imagedst.png",srcImage);
cvReleaseImage(&srcImage);
cvReleaseImage(&grayImage);
cvReleaseImage(&corners1);
cvReleaseImage(&corners2);
cvWaitKey(0);
return 0;




4,hough直线提取

#include <cv.h>
#include <highgui.h>
#include <math.h>
 
int main(int argc, char** argv)
{
    IplImage* src = cvLoadImage( "house.png" , 0 );
    IplImage* dst;
    IplImage* color_dst;
    CvMemStorage* storage = cvCreateMemStorage(0);
    CvSeq* lines = 0;
    int i;
 
    if( !src )
        return -1;
 
    dst = cvCreateImage( cvGetSize(src), 8, 1 );
    color_dst = cvCreateImage( cvGetSize(src), 8, 3 );
 
    cvCanny( src, dst, 50, 200, 3 );
    cvCvtColor( dst, color_dst, CV_GRAY2BGR );
#if 0
    lines = cvHoughLines2( dst, storage, CV_HOUGH_STANDARD, 1, CV_PI/180, 100, 0, 0 );
 
    for( i = 0; i < MIN(lines->total,100); i++ )
    {
        float* line = (float*)cvGetSeqElem(lines,i);
        float rho = line[0];
        float theta = line[1];
        CvPoint pt1, pt2;
        double a = cos(theta), b = sin(theta);
        double x0 = a*rho, y0 = b*rho;
        pt1.x = cvRound(x0 + 1000*(-b));
        pt1.y = cvRound(y0 + 1000*(a));
        pt2.x = cvRound(x0 - 1000*(-b));
        pt2.y = cvRound(y0 - 1000*(a));
        cvLine( color_dst, pt1, pt2, CV_RGB(255,0,0), 3, CV_AA, 0 );
    }
#else
    lines = cvHoughLines2( dst, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI/180, 50, 50, 10 );
    for( i = 0; i < lines->total; i++ )
    {
        CvPoint* line = (CvPoint*)cvGetSeqElem(lines,i);
        cvLine( color_dst, line[0], line[1], CV_RGB(255,0,0), 3, CV_AA, 0 );
    }
#endif
    cvNamedWindow( "Source", 1 );
    cvShowImage( "Source", src );
 
    cvNamedWindow( "Hough", 1 );
    cvShowImage( "Hough", color_dst );
 
    cvWaitKey(0);
 
    return 0;
}




5,hough圆提取

#include <cv.h>
#include <highgui.h>
#include <math.h>
#include <iostream>
using namespace std;
int main(int argc, char** argv)
{
    IplImage* img;
img=cvLoadImage("c4.jpg", 1);
 IplImage* gray = cvCreateImage( cvGetSize(img), 8, 1 );
     CvMemStorage* storage = cvCreateMemStorage(0);
     cvCvtColor( img, gray, CV_BGR2GRAY );
     cvSmooth( gray, gray, CV_GAUSSIAN, 5, 15 );
// smooth it, otherwise a lot of false circles may be detected
CvSeq* circles = cvHoughCircles( gray, storage, CV_HOUGH_GRADIENT, 2, gray->height/4, 200, 100 );
    int i;
     for( i = 0; i < circles->total; i++ )
     {
          float* p = (float*)cvGetSeqElem( circles, i );
          cvCircle( img, cvPoint(cvRound(p[0]),cvRound(p[1])), 3, CV_RGB(0,255,0), -1, 8, 0 );
 cvCircle( img, cvPoint(cvRound(p[0]),cvRound(p[1])), cvRound(p[2]), CV_RGB(255,0,0), 3, 8, 0 );
          cout<<"圆心坐标x= "<<cvRound(p[0])<<endl<<"圆心坐标y= "<<cvRound(p[1])<<endl;
          cout<<"半径="<<cvRound(p[2])<<endl; 
     }
     cout<<"圆数量="<<circles->total<<endl;
     cvNamedWindow( "circles", 1 );
     cvShowImage( "circles", img );
     cvWaitKey(0);
  
    return 0;
}



(未完待续)


0 0
原创粉丝点击