OPenCV操作ImageView.cpp

  1. // ImageView.cpp : implementation of the CImageView class
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include "Image.h"
  6.  
  7. #include "ImageDoc.h"
  8. #include "ImageView.h"
  9.  
  10. /////////begin/////////////////////////////////
  11. #include "cv.h"      // include core library interface
  12. #include "highgui.h" // include GUI library interface
  13.  
  14. #pragma comment(lib, "cv" )
  15. #pragma comment(lib, "highgui" )
  16. #pragma comment(lib, "cxcore" )
  17.  
  18.  
  19.  
  20. CString imgfilepath;
  21. IplImage* img=0; // Declare IPL/OpenCV image pointer
  22.  
  23.  
  24.  
  25. ////////end/////////////////////////////////
  26.  
  27.  
  28.  
  29.  
  30. #ifdef _DEBUG
  31. #define new DEBUG_NEW
  32. #undef THIS_FILE
  33. static char THIS_FILE[] = __FILE__;
  34. #endif
  35.  
  36. /////////////////////////////////////////////////////////////////////////////
  37. // CImageView
  38.  
  39. IMPLEMENT_DYNCREATE(CImageView, CView)
  40.  
  41. BEGIN_MESSAGE_MAP(CImageView, CView)
  42.         //{{AFX_MSG_MAP(CImageView)
  43.         ON_COMMAND(ID_IMAGE_OPENFILE, OnImageOpenFile)
  44.         ON_COMMAND(ID_IMAGE_SOBEL, OnImageSobel)
  45.         ON_COMMAND(ID_IMAGE_LAPLACE, OnImageLaplace)
  46.         ON_COMMAND(ID_IMAGE_CANNY, OnImageCanny)
  47.         ON_COMMAND(ID_IMAGE_HISTGRAM, OnImageHistgram)
  48.         ON_COMMAND(ID_IMAGE_RESIZE, OnImageResize)
  49.         ON_COMMAND(ID_IMAGE_ROTATION, OnImageRotation)
  50.         ON_COMMAND(ID_IMAGE_EROSION, OnImageErosion)
  51.         ON_COMMAND(ID_IMAGE_OPEN, OnImageOpen)
  52.         ON_COMMAND(ID_IMAGE_HOUGH_LINE, OnImageHoughLine)
  53.         ON_COMMAND(ID_IMAGE_HOUGH_CIRCLE, OnImageHoughCircle)
  54.         //}}AFX_MSG_MAP
  55.         // Standard printing commands
  56.         ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
  57.         ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
  58.         ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
  59. END_MESSAGE_MAP()
  60.  
  61. /////////////////////////////////////////////////////////////////////////////
  62. // CImageView construction/destruction
  63.  
  64. CImageView::CImageView()
  65. {
  66.         // TODO: add construction code here
  67.  
  68. }
  69.  
  70. CImageView::~CImageView()
  71. {
  72. }
  73.  
  74. BOOL CImageView::PreCreateWindow(CREATESTRUCT& cs)
  75. {
  76.         // TODO: Modify the Window class or styles here by modifying
  77.         //  the CREATESTRUCT cs
  78.  
  79.         return CView::PreCreateWindow(cs);
  80. }
  81.  
  82. /////////////////////////////////////////////////////////////////////////////
  83. // CImageView drawing
  84.  
  85. void CImageView::OnDraw(CDC* pDC)
  86. {
  87.         CImageDoc* pDoc = GetDocument();
  88.         ASSERT_VALID(pDoc);
  89.         // TODO: add draw code for native data here
  90. }
  91.  
  92. /////////////////////////////////////////////////////////////////////////////
  93. // CImageView printing
  94.  
  95. BOOL CImageView::OnPreparePrinting(CPrintInfo* pInfo)
  96. {
  97.         // default preparation
  98.         return DoPreparePrinting(pInfo);
  99. }
  100.  
  101. void CImageView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  102. {
  103.         // TODO: add extra initialization before printing
  104. }
  105.  
  106. void CImageView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  107. {
  108.         // TODO: add cleanup after printing
  109. }
  110.  
  111. /////////////////////////////////////////////////////////////////////////////
  112. // CImageView diagnostics
  113.  
  114. #ifdef _DEBUG
  115. void CImageView::AssertValid() const
  116. {
  117.         CView::AssertValid();
  118. }
  119.  
  120. void CImageView::Dump(CDumpContext& dc) const
  121. {
  122.         CView::Dump(dc);
  123. }
  124.  
  125. CImageDoc* CImageView::GetDocument() // non-debug version is inline
  126. {
  127.         ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CImageDoc)));
  128.         return (CImageDoc*)m_pDocument;
  129. }
  130. #endif //_DEBUG
  131.  
  132. /////////////////////////////////////////////////////////////////////////////
  133. // CImageView message handlers
  134.  
  135. void CImageView::OnImageOpenFile()
  136. {
  137.         // TODO: Add your command handler code here
  138.                 CFileDialog dlg(TRUE, _T("*.bmp"), "",
  139.                OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST|OFN_HIDEREADONLY,
  140.                "image files (*.bmp; *.jpg) |*.bmp;*.jpg|AVI files (*.avi) |*.avi|All Files (*.*)|*.*||",NULL);
  141.  
  142.         char title[]= {"Open Image"};
  143.         dlg.m_ofn.lpstrTitle= title;
  144.  
  145.         if (dlg.DoModal() == IDOK)
  146.         {
  147.                 imgfilepath= dlg.GetPathName();
  148.                 if (img!=0)
  149.                         cvReleaseImage( &img );
  150.                 img = cvvLoadImage( imgfilepath ); // load image
  151.  
  152.         cvvNamedWindow( "Original Image", 1 );  // create a window
  153.         cvvShowImage( "Original Image", img );  // display the image on window
  154.         }
  155.  
  156. }
  157.  
  158. void CImageView::OnImageSobel()
  159. {
  160.         // TODO: Add your command handler code here
  161.     //定义的变量
  162.         IplImage* pImage= NULL; // 声明IplImage 变量
  163.         IplImage* pImgSobelgray= NULL;// 声明IplImage 变量,用于灰度图像Sobel变换
  164.         IplImage* pImg8u= NULL;// 声明IplImage 变量,用于图像格式转换
  165.         IplImage* pImg8uSmooth= NULL;// 声明IplImage 变量,用于存储平滑后的图像
  166.         IplImage* pImgColor= NULL;// 声明IplImage 变量,用于Sobel变换
  167.         IplImage* pImgSobelcolor= NULL;// 声明IplImage 变量,用于彩色图像Sobel变换
  168.     IplImage* pImgPlanes[3] = { 0, 0, 0 };
  169.  
  170.         //将已读入系统的图像复制一份
  171.         pImage=cvCloneImage( img );
  172.  
  173.         //建立和原始图像一样图像内存区,图像元素的位深度设为IPL_DEPTH_8U
  174.         //即无符号8位整型
  175.         pImg8u = cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U, 1);
  176.         pImg8uSmooth = cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U, 1);
  177.  
  178.         //对灰度图像进行Sobel变换
  179.         //将彩色图像转换为灰度图像
  180.         cvCvtColor(pImage, pImg8u, CV_BGR2GRAY);
  181.  
  182.         //对图像进行高斯滤波
  183.         cvSmooth( pImg8u, pImg8uSmooth,CV_GAUSSIAN,3,0,0);
  184.  
  185.         //建立一新图像内存区,图像元素的位深度设为IPL_DEPTH_16S有符号16位整型
  186.         //因为cvSobel函数要求目标图像必须是16-bit图像
  187.         pImgSobelgray = cvCreateImage(cvGetSize(pImage),IPL_DEPTH_16S, 1);
  188.  
  189.         //计算一阶 x方向的图像差分,可根据需要设置参数
  190.         cvSobel(pImg8uSmooth, pImgSobelgray,0,1,3);
  191.  
  192.         //将图像格式再转换回来,用于显示
  193.     cvConvertScaleAbs(pImgSobelgray,pImg8u,1,0 ) ;
  194.  
  195.         //创建窗口,显示图像
  196.         cvvNamedWindow( "Sobel gray Image", 1 );  
  197.     cvvShowImage( "Sobel gray Image", pImg8u  );
  198.        
  199.         //对彩色图像进行Sobel变换
  200.         //建立3个图像内存区,分别存储图像3个通道,图像元素的位深度设为IPL_DEPTH_8U
  201.         int i;
  202.     for( i = 0; i < 3; i++ )
  203.         pImgPlanes[i] = cvCreateImage( cvSize(pImage ->width, pImage ->height), 8, 1 );
  204.     //建立一新图像内存区,图像元素的位深度设为IPL_DEPTH_16S有符号16位整型
  205.         pImgSobelcolor = cvCreateImage( cvSize(pImage ->width, pImage ->height), IPL_DEPTH_16S, 1 );
  206.      //要求输出图像是 16 位有符号的
  207.     pImgColor = cvCreateImage( cvSize(pImage ->width, pImage ->height), 8, 3 );
  208.    
  209.         //将彩色图像分成3 个单通道图像
  210.     cvCvtPixToPlane(pImage, pImgPlanes[0], pImgPlanes[1], pImgPlanes[2], 0 );
  211.  
  212.         for( i = 0; i < 3; i++ )
  213.     {
  214.         //分别对每通道图像进行Sobel变换
  215.                 cvSobel( pImgPlanes[i], pImgSobelcolor,0,1,3 );
  216.                 //转化为8位的图像
  217.         cvConvertScaleAbs(pImgSobelcolor, pImgPlanes[i], 1, 0 );  
  218.     }
  219.  
  220.         //将各通道图像进行合并
  221.         cvCvtPlaneToPix( pImgPlanes[0], pImgPlanes[1], pImgPlanes[2], 0, pImgColor);
  222.    
  223.         //创建窗口,显示图像
  224.         cvvNamedWindow( "Sobel color Image", 1 );  
  225.     cvvShowImage( "Sobel color Image", pImgColor);  
  226.  
  227.  
  228.         //等待按键
  229.         cvWaitKey(0);
  230.  
  231.         //锁毁窗口
  232.         cvDestroyWindow( " Sobel gray Image " );       
  233.         cvDestroyWindow( " Sobel color Image " );      
  234.  
  235.         //将程序开始定义的变量释放
  236.         cvReleaseImage( & pImage);     
  237.         cvReleaseImage( & pImgSobelgray);
  238.         cvReleaseImage( & pImgSobelcolor);
  239.         cvReleaseImage( & pImg8u);     
  240.         cvReleaseImage( & pImg8uSmooth);
  241.  
  242.        
  243. }
  244.  
  245. void CImageView::OnImageLaplace()
  246. {
  247.         // TODO: Add your command handler code here
  248.         //定义的变量
  249.         IplImage* pImage= NULL;// 声明IplImage 变量
  250.         IplImage* pImgLaplace= NULL;// 声明IplImage 变量,用于Laplace变换
  251.         IplImage* pImg8u= NULL;// 声明IplImage 变量,用于图像格式转换
  252.         IplImage* pImg8uSmooth= NULL;// 声明IplImage 变量,用于存储平滑后的图像
  253.  
  254.         //将已读入系统的图像复制一份
  255.         pImage=cvCloneImage( img );
  256.  
  257.         //建立和原始图像一样图像内存区,图像元素的位深度设为IPL_DEPTH_8U
  258.         //即无符号8位整型
  259.         pImg8u = cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U, 1);
  260.         pImg8uSmooth= cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U, 1);
  261.        
  262.         //将彩色图像转换为灰度图像
  263.         cvCvtColor(pImage,pImg8u, CV_BGR2GRAY);
  264.  
  265.         //对灰度图像进行高斯滤波
  266.         cvSmooth( pImg8u, pImg8uSmooth,CV_GAUSSIAN,3,0,0);
  267.  
  268.         //此函数和cvSobel函数一样要求目标图像必须是16-bit图像
  269.         //如果给8-bit目标图像会报错
  270.         pImgLaplace = cvCreateImage(cvGetSize(img),IPL_DEPTH_16S, 1);
  271.  
  272.         cvLaplace(pImg8uSmooth, pImgLaplace,3);
  273.  
  274.  
  275.     //将图像格式再转换回来,用于显示
  276.         cvConvertScaleAbs(pImgLaplace,pImg8u,1,0 ) ;
  277.  
  278.         //创建窗口,显示图像
  279.         cvvNamedWindow( "laplace gray Image", 1 );  
  280.         cvvShowImage( "laplace gray Image", pImg8u  );  
  281.  
  282.         //等待按键
  283.         cvWaitKey(0);
  284.  
  285.         //销毁窗口
  286.         cvDestroyWindow( " laplace gray Image " );     
  287.  
  288.         //将程序开始定义的变量释放
  289.         cvReleaseImage( & pImage);     
  290.         cvReleaseImage( & pImgLaplace);
  291.         cvReleaseImage( & pImg8u);     
  292.         //cvReleaseImage( & pImg8uSmooth);
  293.        
  294. }
  295.  
  296. void CImageView::OnImageCanny()
  297. {
  298.         // TODO: Add your command handler code here
  299.         IplImage* pImage= NULL;// 声明IplImage 变量
  300.         IplImage* pImgCanny= NULL;// 声明IplImage 变量,用于灰度图像Canny变换
  301.         IplImage* pImg8u= NULL;// 声明IplImage 变量,用于图像格式转换
  302.         IplImage* pImg8uSmooth= NULL;// 声明IplImage 变量,用于存储平滑后的图像
  303.  
  304.         //将已读入系统的图像复制一份
  305.         pImage=cvCloneImage( img );
  306.  
  307.         //建立和原始图像一样图像内存区,图像元素的位深度设为IPL_DEPTH_8U
  308.         //即无符号8位整型
  309.         pImg8u = cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U, 1);
  310.         pImgCanny = cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U, 1);
  311.         pImg8uSmooth = cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U, 1);
  312.  
  313.         //对灰度图像进行Canny变换
  314.         //将彩色图像转换为灰度图像
  315.         cvCvtColor(pImage, pImg8u, CV_BGR2GRAY);
  316.  
  317.         //对图像进行高斯滤波
  318.         cvSmooth( pImg8u, pImg8uSmooth,CV_GAUSSIAN,3,0,0);
  319.  
  320.         //cvCanny的源图像必须是灰度图像
  321.         cvCanny(pImg8uSmooth,pImgCanny, 100, 200, 3 );
  322.  
  323.     //将图像格式再转换回来,用于显示
  324.         cvConvertScaleAbs(pImgCanny,pImg8u,1,0 ) ;
  325.  
  326.         //创建窗口,显示图像
  327.         cvvNamedWindow( "Canny Image", 1 );  
  328.         cvvShowImage( "Canny Image", pImg8u);  
  329.  
  330.         //等待按键
  331.         cvWaitKey(0);
  332.  
  333.         //销毁窗口
  334.         cvDestroyWindow( " Canny Image " );    
  335.  
  336.         //将程序开始定义的变量释放
  337.         cvReleaseImage( & pImage);     
  338.         cvReleaseImage( & pImgCanny);
  339.         cvReleaseImage( & pImg8u);     
  340.         cvReleaseImage( & pImg8uSmooth);
  341.        
  342. }
  343.  
  344. void CImageView::OnImageHistgram()
  345. {
  346.         // TODO: Add your command handler code here
  347.         int hist_size = 255; //直方图的针数
  348.         float range_0[]={0,256}; //第0维数值的变化范围
  349.         float* ranges[] = { range_0 };//第1维数值的变化范围
  350.         int i, bin_w; //下标号
  351.         float max_value = 0, min_value = 0; //直方图数值的max和min
  352.         int min_idx = 0, max_idx = 0; //对应上述max和min数值时的下标号
  353.         double mean = 0, variance = 0; //用于存放平均值(mean)和变化量(variance)的变量
  354.  
  355.         IplImage* pImage= NULL;// 声明IplImage 变量
  356.         IplImage* pImgGray= NULL;// 声明IplImage 变量
  357.  
  358.         //将已读入系统的图像一份
  359.         pImage=cvCloneImage( img );
  360.  
  361.         //建立和原始图像一样图像内存区,图像元素的位深度设为IPL_DEPTH_8U
  362.         pImgGray = cvCreateImage(cvSize(pImage->width,pImage->height),
  363.                         IPL_DEPTH_8U, 1);
  364.  
  365.         //转换成灰度图像
  366.         cvCvtColor(pImage, pImgGray, CV_BGR2GRAY);
  367.  
  368.         //创建一个矩形区域
  369.         CvRect rect = cvRect(0, 0, 500, 600 );
  370.  
  371.         //把矩形作用于图像以建立一个感兴趣区(region of interest, ROI)
  372.         cvSetImageROI(pImgGray, rect);    // 设置 ROI
  373.  
  374.         //创建一个图像用来存放直方图
  375.         IplImage* histImage = cvCreateImage(cvSize(320,200), 8, 1);
  376.         //创建一个指定尺寸的直方图,用于存放从图像获得的信息
  377.         CvHistogram* hist =
  378.                 cvCreateHist(1, &hist_size, CV_HIST_ARRAY, ranges, 1);
  379.         //计算直方图并作用到hist变量
  380.         cvCalcHist( &pImgGray, hist, 0, NULL );
  381.  
  382.         //得到直方图中的最大最小值及其标号
  383.         cvGetMinMaxHistValue( hist, &min_value, &max_value, &min_idx, &max_idx);
  384.         //缩放这些针值以容入图像内
  385.         cvScale( hist->bins, hist->bins, ((double)histImage->height)/max_value, 0 );
  386.  
  387.         //设所有直方图的数值为255
  388.         cvSet( histImage, cvScalarAll(255), 0 );
  389.         //建立一个比例因子以沿宽度缩放
  390.         bin_w = cvRound((double)histImage->width/hist_size);
  391.         for( i = 0; i < hist_size; i++ ) {
  392.                 //把直方图画到图像中
  393.                 cvRectangle( histImage, cvPoint(i*bin_w, histImage->height),
  394.                         cvPoint((i+1)*bin_w,
  395.                         histImage->height - cvRound(cvGetReal1D(hist->bins,i))),
  396.                         cvScalarAll(0), -1, 8, 0 );
  397.  
  398.                 //得到当前数值
  399.                 float* bins = cvGetHistValue_1D(hist,i);
  400.                 //增加均值
  401.                 mean += bins[0];
  402.         //      std::cout<< bins[0] << " " << bins[1] << std::endl;
  403.         }
  404.         //均值计算完毕
  405.         mean /= hist_size;
  406.  
  407.         //有了均值后就可以计算变化量了(variance)
  408.         for( i = 0; i < hist_size; i++ ) {
  409.                 float* bins = cvGetHistValue_1D(hist,i);
  410.                 variance += pow((bins[0] - mean),2);
  411.         }
  412.  
  413.         //变化量计算完毕
  414.         variance /= hist_size;
  415.  
  416. //      std::cout << "Histogram Mean: " << mean << std::endl;
  417. //      std::cout << "Variance: " << variance << std::endl;
  418. //      std::cout << "Standard Deviation: " << sqrt(variance) << std::endl;
  419.  
  420.         //创建窗口,显示图像
  421.         cvNamedWindow("Original", 0);
  422.         cvShowImage("Original", pImage );
  423.  
  424.         cvNamedWindow("Gray", 0);
  425.         cvShowImage("Gray", pImgGray );
  426.  
  427.         cvNamedWindow("Histogram", 0);
  428.         cvShowImage("Histogram", histImage );
  429.  
  430.  
  431.         CvFont *pfont=new CvFont;
  432.         cvInitFont(pfont,CV_FONT_HERSHEY_SIMPLEX  ,0.8f,0.8f,0,2);
  433.         CString Result="Histogram Mean: ";
  434.         CString str; str.Format("%f", mean);
  435.         Result+=str+"\n";
  436.  
  437.         cvPutText(histImage,Result,cvPoint(80,80),pfont,CV_RGB(255,0,0));
  438.         delete pfont;
  439.  
  440.         //等待按键
  441.         cvWaitKey(0);
  442.  
  443.         //将程序开始定义的变量释放
  444.         cvReleaseImage(&histImage);
  445.         cvReleaseImage(&pImgGray);
  446.  
  447.         //销毁窗口
  448.         cvDestroyWindow("Original");
  449.         cvDestroyWindow("Gray");
  450.         cvDestroyWindow("Histogram");
  451.  
  452.        
  453. }
  454.  
  455. void CImageView::OnImageResize()
  456. {
  457.         // TODO: Add your command handler code here
  458.         IplImage* pImage= NULL;// 声明IplImage 变量
  459.         IplImage* pImgNew= NULL;// 声明IplImage 变量
  460.  
  461.  
  462.         //将已读入系统的图像复制一份
  463.         pImage=cvCloneImage( img );
  464.  
  465.         CFileDialog dlg(TRUE, _T("*.bmp"), "",
  466.             OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST|OFN_HIDEREADONLY,
  467.                "image files (*.bmp; *.jpg) |*.bmp;*.jpg|AVI files (*.avi) |*.avi|All Files (*.*)|*.*||",NULL);
  468.  
  469.         char title[]= {"Open Image again"};
  470.         dlg.m_ofn.lpstrTitle= title;
  471.  
  472.         if (dlg.DoModal() == IDOK)
  473.         {
  474.                 imgfilepath= dlg.GetPathName();
  475.                 if (pImgNew!=0)
  476.                         cvReleaseImage( &pImgNew );
  477.                 //载入第二幅图像
  478.                 pImgNew = cvvLoadImage( imgfilepath );
  479.  
  480.                 //创建窗口,显示第二幅图像
  481.                 cvvNamedWindow( "Second Image", 1 );  
  482.                         cvvShowImage( "Second Image", pImgNew );  
  483.         }
  484.    
  485.         //缩放图像,使其尺寸与第二幅图像相等
  486.         cvResize( pImage, pImgNew, CV_INTER_NN );
  487.  
  488.         //创建窗口,显示缩放后的幅图像
  489.         cvvNamedWindow( "Resized Image", 1 );  
  490.         cvvShowImage( "Resized Image", pImgNew );  
  491.  
  492.         //等待按键
  493.         cvWaitKey(0);
  494.  
  495.         //将程序开始定义的变量释放
  496.         cvReleaseImage(&pImage);
  497.         cvReleaseImage(&pImgNew);
  498.  
  499.         //销毁窗口
  500.         cvDestroyWindow("Second Image");
  501.         cvDestroyWindow("Resized Image");
  502.        
  503. }
  504.  
  505. void CImageView::OnImageRotation()
  506. {
  507.         // TODO: Add your command handler code here
  508.         int angle = 30; //旋转30度
  509.         int opt = 0;     // 1: 加缩放
  510.                                 // 0:  仅仅旋转
  511.         double factor; //缩放因子
  512.         IplImage* pImage= NULL;// 声明IplImage 变量
  513.         IplImage* pImgRotation= NULL;// 声明IplImage 变量
  514.        
  515.  
  516.         //将已读入系统的图像复制一份
  517.         pImage=cvCloneImage( img );
  518.         pImgRotation=cvCloneImage( img );
  519.  
  520.         //创建M矩阵
  521.         float m[6];
  522.                         // Matrix m looks like:
  523.                         //
  524.                         // [ m0  m1  m2 ] ===>  [ A11  A12   b1 ]
  525.                         // [ m3  m4  m5 ]       [ A21  A22   b2 ]
  526.                         //
  527.         CvMat M = cvMat( 2, 3, CV_32F, m );
  528.         int w = img->width;
  529.         int h = img->height;
  530.         if(opt) // 旋转加缩放
  531.                                 factor = (cos(angle*CV_PI/180.) + 1.0)*2;
  532.         else //  仅仅旋转
  533.                                 factor = 1;
  534.         m[0] = (float)(factor*cos(-angle*CV_PI/180.));
  535.         m[1] = (float)(factor*sin(-angle*CV_PI/180.));
  536.         m[3] = -m[1];
  537.         m[4] = m[0];
  538.         // 将旋转中心移至图像中间
  539.         m[2] = w*0.5f;
  540.         m[5] = h*0.5f;
  541.                
  542.         //  dst(x,y) = A * src(x,y) + b
  543.         cvZero(pImgRotation);
  544.         cvGetQuadrangleSubPix( pImage, pImgRotation, &M);
  545.                
  546.         //创建窗口,显示图像  
  547.         cvNamedWindow( "Rotation Image", 1 );
  548.         cvShowImage( "Rotation Image", pImgRotation );
  549.                
  550.         //等待按键
  551.         cvWaitKey(0);
  552.  
  553.         //将程序开始定义的变量释放
  554.         cvReleaseImage(&pImage);
  555.         cvReleaseImage(&pImgRotation);
  556.  
  557.         //销毁窗口
  558.         cvDestroyWindow("Rotation Image");
  559.        
  560. }
  561.  
  562. void CImageView::OnImageErosion()
  563. {
  564.         // TODO: Add your command handler code here
  565.         IplImage* pImgErode= NULL;// 声明IplImage 变量
  566.         IplImage* pImgDilate= NULL;// 声明IplImage 变量
  567.  
  568.         //将已读入系统的图像复制一份
  569.         pImgErode=cvCloneImage( img );
  570.         pImgDilate=cvCloneImage( img );
  571.  
  572.  
  573.         //对输入图像使用默认的3×3 长方形结构元素进行腐蚀
  574.         cvErode( pImgErode, pImgErode, 0, 2 );
  575.    
  576.         //对输入图像使用默认的3×3 长方形结构元素进行膨胀
  577.         cvDilate( pImgDilate, pImgDilate, 0, 2 );
  578.        
  579.        
  580.         //创建窗口,显示图像
  581.         cvNamedWindow("Erosion", 0);
  582.         cvShowImage("Erosion", pImgErode );
  583.  
  584.         cvNamedWindow("Dilation", 0);
  585.         cvShowImage("Dilation", pImgDilate );
  586.  
  587.         //等待按键
  588.         cvWaitKey(0);
  589.  
  590.         //将程序开始定义的变量释放
  591.         cvReleaseImage(&pImgErode);
  592.         cvReleaseImage(&pImgDilate);
  593.  
  594.         //销毁窗口
  595.         cvDestroyWindow("Erosion");
  596.         cvDestroyWindow("Dilation");
  597.  
  598.        
  599. }
  600.  
  601. void CImageView::OnImageOpen()
  602. {
  603.         // TODO: Add your command handler code here
  604.         IplImage* pImgOpen= NULL;// 声明IplImage 变量
  605.         IplImage* pImgClose= NULL;// 声明IplImage 变量
  606.         IplConvKernel* pKernel =NULL;// 声明IplConvKernel 变量
  607.  
  608.         //将已读入系统的图像复制一份
  609.         pImgOpen=cvCloneImage( img );
  610.         pImgClose=cvCloneImage( img );
  611.  
  612.        
  613.         //创建立结构元素
  614.         pKernel = cvCreateStructuringElementEx(15,15,8,8,CV_SHAPE_ELLIPSE,NULL);
  615.    
  616.         //进行开运算
  617.         cvErode(pImgOpen,pImgOpen,pKernel,1);
  618.     cvDilate(pImgOpen,pImgOpen,pKernel,1);  
  619.  
  620.        
  621.         //进行闭运算
  622.     cvDilate(pImgClose,pImgClose,pKernel,1);  
  623.         cvErode(pImgClose,pImgClose,pKernel,1);
  624.        
  625.        
  626.         //创建窗口,显示图像
  627.         cvNamedWindow("Open", 0);
  628.         cvShowImage("Open", pImgOpen );
  629.  
  630.         cvNamedWindow("Close", 0);
  631.         cvShowImage("Close", pImgClose );
  632.  
  633.  
  634.         //等待按键
  635.         cvWaitKey(0);
  636.  
  637.         //将程序开始定义的变量释放
  638.         cvReleaseImage(&pImgOpen);
  639.         cvReleaseImage(&pImgClose);
  640.  
  641.         //销毁窗口
  642.         cvDestroyWindow("Open");
  643.         cvDestroyWindow("Close");
  644.        
  645.        
  646. }
  647.  
  648. void CImageView::OnImageHoughLine()
  649. {
  650.         // TODO: Add your command handler code here
  651.         IplImage* pImage= NULL;// 声明IplImage 变量
  652.         IplImage* pImg8u= NULL;// 声明IplImage 变量,用于图像格式转换
  653.         IplImage* pImgCanny= NULL;// 声明IplImage 变量,用于灰度图像Canny变换
  654.         CvMemStorage* storage = NULL;// 声明storage 变量,用于存储检测到的线段
  655.     CvSeq* lines = NULL;   //声明lines变量,用于存储直线的轮廓
  656.        
  657.         //将已读入系统的图像复制两份,一份作为背景图像
  658.         pImage=cvCloneImage( img );
  659.  
  660.         //建立和原始图像一样图像内存区,图像元素的位深度设为IPL_DEPTH_8U
  661.         //即无符号8位整型
  662.         pImg8u = cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U, 1);
  663.         pImgCanny = cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U, 1);
  664.  
  665.         //将彩色图像转换为灰度图像
  666.         cvCvtColor(pImage, pImg8u, CV_BGR2GRAY);
  667.  
  668.         //创建内存空间
  669.         storage = cvCreateMemStorage(0);
  670.  
  671.         //利用Canny变换找出图像边缘
  672.     cvCanny( pImg8u, pImgCanny, 50, 500, 3 );
  673.         //Hough线变换
  674.     lines = cvHoughLines2( pImgCanny, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI/180, 80, 30, 10 );
  675.    
  676.         //在原图上画红直线
  677.         int i;
  678.         for( i = 0; i < lines->total; i++ )
  679.     {
  680.         CvPoint* line = (CvPoint*)cvGetSeqElem(lines,i);
  681.         cvLine( pImage, line[0], line[1], CV_RGB(255,0,0), 3, 8 );
  682.     }
  683.  
  684.  
  685.         //创建窗口,显示图像
  686.     cvNamedWindow( "Hough Line Transform", 1 );
  687.     cvShowImage( "Hough Line Transform", pImage);
  688.  
  689.  
  690.         //等待按键
  691.         cvWaitKey(0);
  692.  
  693.         //销毁窗口
  694.         cvDestroyWindow( " Hough Line Transform " );   
  695.  
  696.         //将程序开始定义的变量释放
  697.         cvReleaseImage( & pImage);     
  698.         cvReleaseImage( & pImgCanny);
  699.         cvReleaseImage( & pImg8u);     
  700.    
  701.        
  702. }
  703.  
  704. void CImageView::OnImageHoughCircle()
  705. {
  706.         // TODO: Add your command handler code here
  707.         IplImage* pImage= NULL;// 声明IplImage 变量
  708.         IplImage* pImg8u= NULL;// 声明IplImage 变量,用于图像格式转换
  709.         CvMemStorage* storage = NULL;// 声明storage 变量,用于存储检测到的线段
  710.     CvSeq* circles = NULL;
  711.        
  712.  
  713.         //将已读入系统的图像一份
  714.         pImage=cvCloneImage( img );
  715.  
  716.         //建立和原始图像一样图像内存区,图像元素的位深度设为IPL_DEPTH_8U
  717.         //即无符号8位整型
  718.         pImg8u = cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U, 1);
  719.  
  720.  
  721.         //转换成灰度图像
  722.     if(img->nChannels != 1)
  723.          cvCvtColor( pImage, pImg8u, CV_BGR2GRAY );
  724.     else
  725.          cvCopy(pImage, pImg8u);
  726.     //平滑化
  727.     cvSmooth( pImg8u, pImg8u, CV_GAUSSIAN, 7, 7 );
  728.  
  729.         //创建内存空间
  730.         storage = cvCreateMemStorage(0);
  731.  
  732.         //Hough圆变换
  733.     circles = cvHoughCircles( pImg8u, storage, CV_HOUGH_GRADIENT, 2, pImg8u->height/4, 250, 55 );
  734.  
  735.         // 画出识别出的圆
  736.         int i;
  737.         for( i = 0; i < circles->total; i++ )
  738.         {
  739.                   float* p = (float*)cvGetSeqElem( circles, i );
  740.                   cvCircle(pImage, cvPoint(cvRound(p[0]),cvRound(p[1])), cvRound(p[2]), CV_RGB(255,0,0), 3, 8, 0 );
  741.         }
  742.  
  743.         //创建窗口,显示图像
  744.     cvNamedWindow( "Hough Circle Transform", 1 );
  745.     cvShowImage( "Hough Circle Transform", pImage);
  746.  
  747.  
  748.         //等待按键
  749.         cvWaitKey(0);
  750.  
  751.         //销毁窗口
  752.         cvDestroyWindow( " Hough Circle Transform " ); 
  753.  
  754.         //将程序开始定义的变量释放
  755.         cvReleaseImage( & pImage);     
  756.         cvReleaseImage( & pImg8u);     
  757.        
  758.        
  759. }
posted on 2010-08-30 15:07  carekee  阅读(2242)  评论(0)    收藏  举报