形状提取
#include <opencv2/opencv.hpp>
using namespace cv;
/*
形状提取
*/
int main()
{
IplImage* pCannyImg = NULL;
IplImage* pImg = NULL;
Mat img = imread("../../leaf2.jpg",1);
// Mat img = imread("image.jpg");
Mat grey;
cvtColor(img, grey, CV_BGR2GRAY);
Mat sobelx;
Sobel(grey, sobelx, CV_32F, 1, 0);
double minVal, maxVal;
minMaxLoc(sobelx, &minVal, &maxVal); //find minimum and maximum intensities
Mat draw;
sobelx.convertTo(draw, CV_8U, 255.0/(maxVal - minVal), -minVal * 255.0/(maxVal - minVal));
namedWindow("1", CV_WINDOW_AUTOSIZE);
imshow("1",img);
imshow("",draw);
//*pImg = IplImage(draw);
//pCannyImg = cvCreateImage(cvGetSize(&draw), IPL_DEPTH_8U, 1);
//cvCanny(&draw, pCannyImg, 100, 180, 3);
//cvNamedWindow("canny",1);
//cvShowImage( "canny", pCannyImg );
waitKey();
return 0;
}
轮廓提取
#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( "../test.jpg",0);
//为canny边缘图像申请空间
//IplImage* cvCreateImage( CvSize size, int depth, int channels );
pCannyImg = cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U, 1);
//canny边缘检测
//第一个参数image 输入单通道图像(可以是彩色图像)对于多通道的图像可以用cvCvtColor()修改。
//第三个参数是控制细节的,越小细节越多,
cvCanny(pImg, pCannyImg, 50, 150, 3);
//创建窗口
//0表示用户可以手动调节窗口大小,且显示的图像尺寸随之变化。
cvNamedWindow("src", 1);
cvNamedWindow("canny",1);
//显示图像
cvShowImage( "src", pImg );
cvShowImage( "canny", pCannyImg );
//等待按键
cvWaitKey(0);
//销毁窗口
cvDestroyWindow( "src" );
cvDestroyWindow( "canny" );
//释放图像
cvReleaseImage( &pImg );
cvReleaseImage( &pCannyImg );
return 0;
}
角特征提取
#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;
//typedef struct CvScalar
//{
// double val[4];
// }CvScalar;
//
//在Opencv中,cvScalar是CV_RGB的宏,cvScalar的储存顺序是B-G-R,而CV_RGB的储存顺序是R-G-B,两者正好相反
//所以你的cvScalar(255,0,0),实际意思是B=255,当然是蓝色的
CvScalar color = CV_RGB(255,0,0);
cvNamedWindow("image",1);
//Load the image to be processed
srcImage = cvLoadImage("../test.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;
}
纹理提取
#include <iostream>
#include <math.h>
#include "cv.h"
#include "highgui.h"
int main(int argc, char* argv[])
{
int tmp[8]={0};
int sum=0;int k=0;
IplImage* img,*dst;
img=cvLoadImage("../test.jpg",0);
CvScalar s;
cvNamedWindow("img",NULL);
cvNamedWindow("dst",NULL);
cvShowImage("img",img);
uchar* data=(uchar*)img->imageData;
int step=img->widthStep;
dst=cvCreateImage(cvSize(img->width,img->height),img->depth,0);
dst->widthStep=img->widthStep;
for(int i=1;i<img->height-1;i++)
for(int j=1;j<img->width-1;j++)
{
if(data[(i-1)*step+j-1]>data[i*step+j]) tmp[0]=1;
else tmp[0]=0;
if(data[i*step+(j-1)]>data[i*step+j]) tmp[1]=1;
else tmp[1]=0;
if(data[(i+1)*step+(j-1)]>data[i*step+j]) tmp[2]=1;
else tmp[2]=0;
if (data[(i+1)*step+j]>data[i*step+j]) tmp[3]=1;
else tmp[3]=0;
if (data[(i+1)*step+(j+1)]>data[i*step+j]) tmp[4]=1;
else tmp[4]=0;
if(data[i*step+(j+1)]>data[i*step+j]) tmp[5]=1;
else tmp[5]=0;
if(data[(i-1)*step+(j+1)]>data[i*step+j]) tmp[6]=1;
else tmp[6]=0;
if(data[(i-1)*step+j]>data[i*step+j]) tmp[7]=1;
else tmp[7]=0;
for(k=0;k<=7;k++)
sum+=abs(tmp[k]-tmp[k+1]);
sum=sum+abs(tmp[7]-tmp[0]);
if (sum<=2)
s.val[0]=(tmp[0]*128+tmp[1]*64+tmp[2]*32+tmp[3]*16+tmp[4]*8+tmp[5]*4+tmp[6]*2+tmp[7]);
else s.val[0]=59;
cvSet2D(dst,i,j,s);
}
cvShowImage("dst",dst);
cvWaitKey(-1);
return 0;
}
改变图片尺寸
通常进行图像识别要对图片进行预处理,同一尺寸很关键。
#include "cv.h"
#include "highgui.h"
#include "stdio.h"
int main(int argc,char *argv[])
{
IplImage *image=0,*imageresize=0;
image=cvLoadImage("../../test.jpg",1);
if(!image) printf("can't load an image/n");
imageresize=cvCreateImage(cvSize(64,64),IPL_DEPTH_8U,3); //cvSize(width,heigth)尺寸改这里
cvResize(image,imageresize,CV_INTER_LINEAR);
cvNamedWindow("lena",1);
cvNamedWindow("size",1);
cvShowImage("size",imageresize);
cvShowImage("lena",image);
cvWaitKey(0);
cvReleaseImage(&image);
cvReleaseImage(&imageresize);
cvDestroyWindow("size");
cvDestroyWindow("lena");
return 0;
}
滤波(模糊)
#include "cv.h"
#include "highgui.h"
#include "stdio.h"
int main(){
IplImage *image=0,*img=0;
IplImage* pCannyImg = NULL;
image= cvLoadImage("../../test.jpg");//读取图片
img=cvCreateImage(cvSize(480,480),IPL_DEPTH_8U,3);
cvResize(image,img,CV_INTER_LINEAR);
cvNamedWindow("Example1",CV_WINDOW_AUTOSIZE);
cvNamedWindow("Example2",CV_WINDOW_AUTOSIZE);
cvNamedWindow("Example3",CV_WINDOW_AUTOSIZE);
cvNamedWindow("Example4",CV_WINDOW_AUTOSIZE);
cvNamedWindow("Example5",CV_WINDOW_AUTOSIZE);
cvNamedWindow("Example6",CV_WINDOW_AUTOSIZE);
cvShowImage("Example1",img);//在Example1显示图片
// cvCopy(img,temp);
IplImage* temp=cvCreateImage( //创建一个size为image,三通道8位的彩色图
cvGetSize(img),
IPL_DEPTH_8U,
3
);
cvSmooth(img,temp,CV_BLUR,3,3);//简单模糊
cvShowImage("Example2",temp);
cvSmooth(img,temp,CV_BLUR_NO_SCALE,3,3);//简单无缩放变化的模糊
cvShowImage("Example3",temp);
cvSmooth(img,temp,CV_MEDIAN,3,3);//中值模糊
cvShowImage("Example4",temp);
cvSmooth(img,temp,CV_GAUSSIAN,3,3);//高斯模糊
cvShowImage("Example5",temp);
cvSmooth(img,temp,CV_BILATERAL,1,600,500,500);//双边滤波
cvShowImage("Example6",temp);
//边缘提取
//为边缘图像申请空间
//pCannyImg = cvCreateImage(cvGetSize(temp), IPL_DEPTH_8U, 1);
//cvCanny(temp, pCannyImg, 50, 150, 3);
//cvNamedWindow("canny", 1);
//cvShowImage( "canny", pCannyImg );
cvWaitKey(0);//暂停用于显示图片
cvReleaseImage(&img);//释放img所指向的内存空间并且
cvDestroyWindow("Example1");
cvDestroyWindow("Example2");
cvDestroyWindow("Example3");
cvDestroyWindow("Example4");
cvDestroyWindow("Example5");
cvDestroyWindow("Example6");
return 0;
}
就是变模糊,模糊的效果不太一样。不同场合不同需求来选择。中值模糊+边缘提取就要比高斯滤波+边缘提取感觉效果好点。