灰度变换、自适应高斯滤波、平滑滤波、canny边缘检测、直线霍夫变换

来源:互联网 发布:暗黑破坏神2 mac 补丁 编辑:程序博客网 时间:2024/05/21 19:49

这是我第一次写博客,主要是记录自己的学习历程,帮助像我这样的新学者提供一点点思路。
我用的opencv版本是2.4.9 和 vs2010 版本比较旧。
这里面主要有灰度变换、自适应高斯滤波、平滑滤波、canny边缘检测、直线霍夫变换,还有一个旋转变换没有实验,里面还有Mat和IplImage图像转换。

#include "stdafx.h"#include <opencv2/opencv.hpp>using namespace cv;//C++ interface enableconst char* pStrWinddowsBinaryTitle="二值图";const char* pStrGasTitle="高斯";const char* pStrSrcTitle="原图";const char* pStrWindowsToolBarName = "二值图阈值"; const char* pStrName="adaptive";IplImage* pSrcImage=NULL; //此处是在使用C接口的opencv创建的对象IplImage *pGrayImage = NULL; IplImage* pDstImage=NULL;IplImage* pGasImage=NULL;Mat mCannyImage,mGrayImage,mBlurImage,mGaussian,mDstImage,mRangeImage,mAdaptiveThresholdImage;;int _blocksize = 0;int _param1 = 0;//拖动条回掉函数void on_trackbar(int pos){    // 转为二值图      cvThreshold(pGrayImage, pDstImage, pos, 255, CV_THRESH_BINARY);      // 显示二值图      cvShowImage(pStrWinddowsBinaryTitle, pDstImage);    cvSmooth(pDstImage,pGasImage,CV_GAUSSIAN,7,7,0,0);    cvNamedWindow(pStrGasTitle, CV_WINDOW_AUTOSIZE);    cvShowImage(pStrGasTitle,pGasImage);}void on_track(int ,void*){    int blocksize = _blocksize * 2 + 3;     //计算阈值的像素邻域大小3,5,7...    13比较好    int param1 = _param1 - 50;    //被均值和加权均值减去的常量, 范围取[-50,50]      -50比较好             adaptiveThreshold(mGrayImage,mAdaptiveThresholdImage,200,ADAPTIVE_THRESH_MEAN_C,THRESH_BINARY,blocksize,param1);    imshow(pStrName,mAdaptiveThresholdImage);}void rotateImage(IplImage* img, IplImage *img_rotate,int degree)  {      //旋转中心为图像中心      CvPoint2D32f center;        center.x=float (img->width/2.0+0.5);      center.y=float (img->height/2.0+0.5);      //计算二维旋转的仿射变换矩阵      float m[6];                  CvMat M = cvMat( 2, 3, CV_32F, m );      cv2DRotationMatrix( center, degree,1, &M);      //变换图像,并用黑色填充其余值      cvWarpAffine(img,img_rotate, &M,CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS,cvScalarAll(0) ); }  int main(int argc, char* argv[]){    Mat mSrcImage=imread("001.jpg");//C:\\Users\\Junqi\\Desktop\\潘晓婷.jpg    /*mCannyImage.create(mSrcImage.size(),mSrcImage.type());    mGrayImage.create(mSrcImage.size(),mSrcImage.type());    mBlurImage.create(mSrcImage.size(),mSrcImage.type());    mCannyImage.create(mSrcImage.size(),mSrcImage.type());    mGaussian.create(mSrcImage.size(),mSrcImage.type());*/    cvtColor(mSrcImage,mGrayImage,CV_BGR2GRAY);    //inRange(mGrayImage,50,150,mRangeImage);    GaussianBlur(mGrayImage,mGaussian,Size(5,5),5,5,4);    blur(mGaussian,mBlurImage,Size(9,9));    Canny(mBlurImage,mCannyImage,50,150,3,false);//  mDstImage=Scalar::all(0);//  mSrcImage.copyTo(mDstImage,mCannyImage);    IplImage* iGaryImage=&IplImage(mGrayImage);    //Mat aaa(iGaryImage);    Mat aaa=iGaryImage;    cvNamedWindow("iii",CV_WINDOW_AUTOSIZE);    cvShowImage("iii",iGaryImage);    cvNamedWindow(pStrName, CV_WINDOW_AUTOSIZE);    createTrackbar("blockSize",pStrName,&_blocksize,50,on_track);    createTrackbar("param1",pStrName,&_param1,100,on_track);    vector<Vec4i> lines;//定义一个矢量结构lines用于存放得到的线段矢量集合      HoughLinesP(mCannyImage, lines, 1, CV_PI/180, 80, 50, 10 );      //【4】依次在图中绘制出每条线段      for( size_t i = 0; i < lines.size(); i++ )       {          Vec4i l = lines[i];          line( mCannyImage, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(186,88,255), 5, CV_AA);      }     cvNamedWindow(pStrSrcTitle,CV_WINDOW_AUTOSIZE);//while using the function of imshow ,this function  can be ignore    imshow(pStrSrcTitle,mSrcImage);    imshow("Range",mRangeImage);    imshow("Gray",mGrayImage);    imshow("BLur",mBlurImage);    imshow("Gaussian",mGaussian);    imshow("Canny",mCannyImage);    imshow("Final",mDstImage);    imshow("aaa",aaa);    cvWaitKey(0);    destroyWindow(pStrSrcTitle);  /*  pSrcImage=cvLoadImage("001.jpg",1);    pGrayImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U,1);     pGasImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U,1);     pDstImage=cvCreateImage(cvGetSize((pSrcImage)),IPL_DEPTH_8U,1);    cvCvtColor(pSrcImage, pGrayImage, CV_BGR2GRAY);     //GaussianBlur(pGrayImage,pGasImage,Size(5,5),0,0);    cvNamedWindow(pStrSrcTitle,CV_WINDOW_AUTOSIZE);    cvShowImage(pStrSrcTitle,pSrcImage);    warpAffine(pSrcImage,);    cvNamedWindow(pStrWinddowsBinaryTitle,CV_WINDOW_AUTOSIZE);    int nThreshold = 0;      // 创建二值图窗口       cvCreateTrackbar(pStrWindowsToolBarName, pStrWinddowsBinaryTitle, &nThreshold, 254, on_trackbar);      on_trackbar(1);     cvWaitKey(0);    cvDestroyWindow(pStrSrcTitle);    cvDestroyWindow(pStrGasTitle);    cvDestroyWindow(pStrWinddowsBinaryTitle);     cvReleaseImage(&pSrcImage);    cvReleaseImage(&pGasImage);    cvReleaseImage(&pDstImage);    cvReleaseImage(&pGrayImage);*/    return 0;}

这就是一些代码,没有贴出来结果,大家可以试一试,有问题可以联系我。

1 0
原创粉丝点击