资源描述
中值滤波-均值滤波-边缘检测-角点检测-基于opencv
ÖÐÖµÂ˲¨,¾ùÖµÂ˲¨,±ßÔµ¼ì²â,½Çµã¼ì²â,»ùÓÚopencv.txt¡°Áµ¡±ÊǸöºÜÇ¿º·µÄ×Ö¡£ËüµÄÉϰ벿ȡ×Ô¡°±ä̬¡±µÄ¡°±ä¡±£¬Ï°벿ȡ×Ô¡°±ä̬¡±µÄ¡°Ì¬¡±¡£#include <iostream>
#include <cv.h>
#include <highgui.h>
using namespace std;
bool FilterAV(IplImage* &image,int k);
bool FilterAV2(IplImage* &image,int k);
bool FilterMid(IplImage* &image,int k);
bool FilterMid2(IplImage* &image,int k);
bool FeatureTrack(IplImage* &image);
bool EdgeTrack(IplImage* &image,int threshold1,int threshold2);
int main(int argc,char *argv[])//argcÖ¸±äÁ¿µÄ¸öÊý£¬*argvÖ¸Ïò×Ö·û±äÁ¿
{
IplImage *img=0;
int height,width,step,channels;
uchar *data;
//ÔØÈëͼÏñ
//img=cvLoadImage("OpenCvDemo.jpg",0);//ת»¯Îªµ¥Í¨µÀ£¬»Ò¶ÈͼÏñ5
img=cvLoadImage("OpenCvDemo.jpg",0);
if (!img)
{
printf("could not load image file: %s\n","OpenCvDemo.jpg");
exit(0);
}
//»ñȡͼÏñÊý¾Ý
height=img->height;
width=img->width;
step=img->widthStep;
channels=img->nChannels;
data=(uchar*)img->imageData;
printf("processing a %dx%d image with %d channels\n",height,width,channels);
//´´½¨´°¿Ú
cvNamedWindow("mainWin",CV_WINDOW_AUTOSIZE);
cvMoveWindow("mainWin",100,100);//ÒÆ¶¯´°¿Ú£¬ÒÔÆÁÄ»×óÉÏ½ÇµÄÆðµãµÄÆ«ÒÆÁ¿
//FilterAV2(img,3);
//FilterAV(img,3);
//FilterMid(img,3);
//FilterMid2(img,3);
//FilterAV(img,3);
FeatureTrack(img);
//EdgeTrack(img,60,80);
//ÏÔʾͼÏñ
cvShowImage("mainWin",img);
//wait for a key
cvWaitKey(0);
//release the image
cvReleaseImage(&img);
return 0;
}
bool FilterAV(IplImage* &image,int k)
{//¾ùÖµÂ˲¨
IplImage *image2=cvCreateImage(cvSize(image->width,image->height),image->depth,1);
uchar *p=(uchar *)image2->imageData;//ÉêÇëimage2ͼÏñ¿Õ¼ä
int m=(k-1)/2;
for (int x=m;x<image->height-m;++x)
for (int y=m;y<image->width-m;++y)
{
int SumData=0;
for (int i=-m;i<m+1;++i)
for (int j=-m;j<m+1;++j)
{//kÎªÆæÊý£¬¼ÆËãk*kÇøÓòµÄ»Ò¶ÈºÍ
SumData+=(int)((uchar *)image->imageData)[(x+i)*image->widthStep+y+j];
}
p[x*image->widthStep+y]=SumData/(k*k);
}
image=cvCloneImage(image2);//¿½±´¸øÔͼÏñ
cvReleaseImage(&image2);//Ïú»ÙÁÙʱ±äÁ¿
return true;
}
bool FilterAV2(IplImage* &image,int k)
{//µ÷ÓÃcvSmoothº¯ÊýʵÏÖ
IplImage *dstImage=0;
dstImage=cvCreateImage(cvGetSize(image),image->depth,1);
cvSmooth(image,dstImage,CV_BLUR,k,k);
//CV_BLURÔÚ3*3´óС½øÐоùÖµÂ˲¨
image=cvCloneImage(dstImage);
cvReleaseImage(&dstImage);
return true;
}
bool FilterMid(IplImage* &image,int k)
{//ÖÐÖµÂ˲¨º¯Êý
IplImage *image2=cvCreateImage(cvSize(image->width,image->height),image->depth,1);
uchar *ImagePix=(uchar *)image2->imageData;
int m=(k-1)/2;
for (int x=m;x<image->height-m;++x)
for (int y=m;y<image->width-m;++y)
{
uchar PixArray[100];
int t=0;
for (int i=-m;i<m+1;++i)
for(int j=-m;j<m+1;++j)
{//¸³Öµ²Ù×÷
PixArray[t++]=((uchar *)image->imageData)[(x+i)*image->widthStep+y+j];
}
for (int i=0;i<k*k-1;++i)
for(int j=0;j<k*k-i-1;++j)
{//ÆðÅÝ·¨¿ìËÙÅÅÐò
if (PixArray[j]>PixArray[j+1])
{
uchar k=PixArray[j];
PixArray[j]=PixArray[j+1];
PixArray[j+1]=k;
}
}
ImagePix[x*image->widthStep+y]=PixArray[(k*k-1)/2];
}
image=cvCloneImage(image2);//¿½±´¸øÔͼÏñ
cvReleaseImage(&image2);//Ïú»ÙÁÙʱ±äÁ¿
return true;
}
bool FilterMid2(IplImage* &image,int k)
{
//IplImage *dstImage=0;
//dstImage=cvCreateImage(cvGetSize(image),image->depth,1);
//cvSmooth(image,dstImage,CV_MEDIAN,k,k);
////CV_BLURÔÚ3*3´óС½øÐоùÖµÂ˲¨
//image=cvCloneImage(dstImage);
//cvReleaseImage(&dstImage);
cvSmooth(image,image,CV_MEDIAN,k,k);
return true;
}
//½Çµã¼ì²âÓë±ßÔµ¼ì²â
bool FeatureTrack(IplImage* &image)
{
CvPoint2D32f corners[100000];
int CornerCount=0;
IplImage *corners1=0,*corners2=0;
corners1= cvCreateImage(cvGetSize(image), image->depth, 1);
corners2= cvCreateImage(cvGetSize(image),image->depth, 1);
cvGoodFeaturesToTrack(image,corners1,corners2,corners,&CornerCount,0.05,20,0);
cout<<"Track over!";
// draw circles at each corner location in the gray image and
// print out a list the corners
for (int i=0;i<CornerCount;++i)
{
cvCircle(image,cvPoint((int)corners[i].x,(int)corners[i].y),5,cvScalar(255,255,255),2);
}
cvReleaseImage(&corners1);
cvReleaseImage(&corners2);
return true;
}
bool EdgeTrack(IplImage* &image,int threshold1,int threshold2)
{
IplImage *edge=0;
edge=cvCreateImage(cvGetSize(image),image->depth,1);
//cvNot(image,edge);
//Êý×éÈ¡·´²Ù×÷,ûÓÃÎÒ¾õµÃ
cvCanny(image,image,threshold1,threshold2,3);
//threshold1,threshold2ÖнÏСµÄ¿ØÖƱßÔµÁ¬½Ó£¬´óµÄ¿ØÖƱßÔµµÄ³õʼ·Ö¸î
//Á½¸ö¶¼ÊÇimageÒ²ÐС£¡£¡£‡åËÀÁË
return true;
}
展开阅读全文