久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5623|回復(fù): 7
收起左側(cè)

視覺檢測設(shè)計與實踐(米粒計數(shù))c++源程序

[復(fù)制鏈接]
ID:209005 發(fā)表于 2017-6-7 22:51 | 顯示全部樓層 |閱讀模式
這是視覺檢測試驗中的米粒計數(shù):

c++源程序如下:
  1. // 米粒計數(shù).cpp : Defines the entry point for the console application.
  2. //

  3. #include "stdafx.h"
  4. #include "cv.h"
  5. #include "highgui.h"
  6. #include "cxcore.h"
  7. #include "stdlib.h"
  8. #include <iostream>
  9. using namespace std;

  10. //獲取灰度圖像
  11. IplImage * LoadImage()
  12. {
  13.         //IplImage(Cxcore基礎(chǔ)結(jié)構(gòu))
  14.         //載入彩色圖像(3信道)(HighGUI讀取與保存圖像)
  15.         IplImage * pImageSrc = cvLoadImage("rice.png",1);//測試圖.jpg
  16.         if(!pImageSrc)
  17.         {
  18.                 cout << "Could not load image file!" << endl;
  19.                 exit(0);
  20.         }
  21.        
  22.         //顯示圖像(HighGUI簡單圖形界面)
  23.         cvNamedWindow("原米粒圖像");
  24.         //        cvShowImage("原米粒圖像",pImageSrc);
  25.         //        cvWaitKey(0);
  26.         //        cvDestroyWindow("原米粒圖像");
  27.        
  28.        
  29.         //灰度圖(Cxcore數(shù)組操作)
  30.         IplImage* pImageGray = cvCreateImage(cvGetSize(pImageSrc),IPL_DEPTH_8U,1);
  31.         //色彩空間轉(zhuǎn)換(Cv圖像處理)
  32.         cvCvtColor(pImageSrc,pImageGray,CV_BGR2GRAY);
  33.        
  34.         cvShowImage("原米粒圖像",pImageGray);
  35.         cvWaitKey(0);
  36.        
  37.         //Cxcore數(shù)組操作
  38.         cvReleaseImage(&pImageSrc);
  39.         return pImageGray;
  40. }

  41. //對灰度圖像進行預(yù)處理(均值濾波)
  42. IplImage * PreProcess(IplImage * pImageGray)
  43. {
  44.         //預(yù)處理結(jié)果圖(Cxcore數(shù)組操作)
  45.         IplImage* pImagePrePro = cvCreateImage(cvGetSize(pImageGray),IPL_DEPTH_8U,1);
  46.         //均值濾波(Cv圖像處理)
  47.         cvSmooth(pImageGray, pImagePrePro,CV_BLUR,3,3,0,0);
  48.         //顯示圖像(HighGUI簡單圖形界面)
  49.         cvNamedWindow("均值濾波圖像");
  50.         cvShowImage("均值濾波圖像",pImagePrePro);
  51.         cvWaitKey(0);
  52.        
  53.         /*        //opencv濾波結(jié)果
  54.         for(int xindex = 10; xindex < 20; xindex ++)
  55.         {
  56.         for(int yindex = 10; yindex < 20; yindex ++)
  57.         {
  58.         cout << cvRound(cvGet2D(pImagePrePro,yindex,xindex).val[0]) << '\t';
  59.         }
  60.         }
  61.         cout << endl;*/
  62.        
  63.         //自己編程對比
  64.         //圖像拷貝(Cxcore數(shù)組操作)
  65.         IplImage* pImagePrePro1 = cvCloneImage(pImageGray);
  66.         //        cvSet(pImagePrePro1,cvScalarAll(0),0);
  67.        
  68.         //均值濾波(Cxcore數(shù)組操作)
  69.         CvScalar sum;
  70.         //滑動窗口增量
  71.         int xincrement = -1,xincrement1 = 1;
  72.         int yincrement = -1,yincrement1 = 1;
  73.         for(int xindex = 1; xindex < pImageGray->width - 1; xindex ++)
  74.         {
  75.                 for(int yindex = 1; yindex < pImageGray->height - 1; yindex ++)
  76.                 {
  77.                         sum.val[0] = 0;
  78.                         //滑動窗口計算均值
  79.                         for(int xtemp = xincrement; xtemp <= xincrement1 ;xtemp ++)
  80.                         {
  81.                                 for(int ytemp = yincrement; ytemp <= yincrement1;ytemp ++)
  82.                                 {
  83.                                         //注意:數(shù)組和圖像的xy坐標(biāo)不一樣
  84.                                         sum.val[0] += cvGet2D(pImageGray,yindex + ytemp,xindex + xtemp).val[0];
  85.                                 }
  86.                         }
  87.                         //求均值(Cxcore數(shù)組操作)
  88.                         sum.val[0] = cvRound(sum.val[0] / ((yincrement1 - yincrement + 1) * (xincrement1 - xincrement + 1)));
  89.                         cvSet2D(pImagePrePro1,yindex,xindex,sum);
  90.                 }
  91.         }
  92.         //顯示圖像(HighGUI簡單圖形界面)
  93.         cvNamedWindow("均值濾波圖像1");
  94.         cvShowImage("均值濾波圖像1",pImagePrePro1);
  95.         cvWaitKey(0);
  96.        
  97.         /*        //測試濾波的正確性
  98.         //自己編程實現(xiàn)濾波結(jié)果
  99.         for(xindex = 10; xindex < 20; xindex ++)
  100.         {
  101.         for(int yindex = 10; yindex < 20; yindex ++)
  102.         {
  103.         cout << cvRound(cvGet2D(pImagePrePro1,yindex,xindex).val[0]) << '\t';
  104.         }
  105.         }
  106.         cout << endl;*/
  107.        
  108.         cvReleaseImage(&pImagePrePro1);
  109.         return pImagePrePro;
  110. }

  111. //迭代閾值分割
  112. IplImage * Segmentation(IplImage * pImagePrePro)
  113. {
  114.         IplImage* pImageBw = cvCloneImage(pImagePrePro);
  115.        
  116.         //二值分割圖像(Cv圖像處理)
  117.         cvThreshold(pImagePrePro, pImageBw, 119 ,255, CV_THRESH_BINARY);
  118.        
  119.         //顯示圖像(HighGUI簡單圖形界面)
  120.         cvNamedWindow("二值圖像");
  121.         cvShowImage("二值圖像",pImageBw);
  122.         cvWaitKey(0);
  123.        
  124.         //自己編程實現(xiàn)迭代閾值分割
  125.         IplImage* pImageBw1 = cvCloneImage(pImagePrePro);
  126.         //初始閾值為圖像的平均灰度(Cxcore數(shù)組操作)
  127.         CvScalar threshold = cvAvg(pImageBw1);
  128.         //        cout << threshold.val[0] << endl;
  129.        
  130.         /*//求平均灰度,驗證初始閾值的正確性(可以用cvSum)
  131.         CvScalar sum;
  132.         sum.val[0] = 0;
  133.         for(int xindex = 0; xindex < pImagePrePro->width; xindex ++)
  134.         {
  135.         for(int yindex = 0; yindex < pImagePrePro->height; yindex ++)
  136.         {
  137.         sum.val[0] += cvGet2D(pImagePrePro,yindex,xindex).val[0];
  138.         }
  139.         }
  140.         sum.val[0] = sum.val[0] / (pImagePrePro->width * pImagePrePro->height);
  141.         cout << sum.val[0] << endl;
  142.         */
  143.        
  144.         //迭代閾值分割
  145.         CvScalar threshold1;
  146.         threshold1.val[0] = 0;
  147.         CvScalar temp1,temp2;
  148.         temp1.val[0] = 0;
  149.         temp2.val[0] = 0;
  150.         while(abs(threshold.val[0] - threshold1.val[0]) > 0.1)
  151.         {
  152.                 threshold1 = threshold;
  153.                 IplImage* pImageTemp = cvCloneImage(pImageBw1);
  154.                 //計算前景的平均灰度
  155.                 cvThreshold(pImageBw1, pImageTemp,threshold1.val[0],255, CV_THRESH_TOZERO);
  156.                 //注意:不能用cvAvg (Cxcore數(shù)組操作)
  157.                 temp1.val[0] = cvSum(pImageTemp).val[0] / cvCountNonZero(pImageTemp);
  158.                
  159.                 //計算背景的平均灰度
  160.                 cvThreshold(pImageBw1, pImageTemp,threshold1.val[0],255, CV_THRESH_TOZERO_INV);
  161.                 temp2.val[0] = cvSum(pImageTemp).val[0] / cvCountNonZero(pImageTemp);
  162.                
  163.                 //獲取新閾值
  164.                 threshold.val[0] = (temp1.val[0] + temp2.val[0]) / 2;
  165.                 cvReleaseImage(&pImageTemp);
  166.         }
  167.         //迭代后得到分割閾值
  168.         cout << "迭代閾值:" << threshold.val[0] << endl;
  169.        
  170.         //二值分割圖像(Cv圖像處理)
  171.         cvThreshold(pImageBw1, pImageBw1, threshold.val[0] ,255, CV_THRESH_BINARY);
  172.        
  173.         //顯示圖像(HighGUI簡單圖形界面)
  174.         cvNamedWindow("二值圖像1");
  175.         cvShowImage("二值圖像1",pImageBw1);
  176.         cvWaitKey(0);
  177.        
  178.         cvReleaseImage(&pImageBw1);
  179.         return pImageBw;
  180. }

  181. void GetParameter(IplImage * pImageBw)
  182. {
  183.         //輪廓的存儲容器(Cxcore動態(tài)結(jié)構(gòu))
  184.         CvMemStorage* storage = cvCreateMemStorage(0);
  185.         //輸出參數(shù):包含第一個輸出輪廓的指針
  186.         CvSeq* first_contour = 0;
  187.         IplImage* pImageBw1 = cvCloneImage(pImageBw);
  188.         //在二值圖像中尋找定點序列輪廓(Cv圖像處理)//注意pImgBw1會被改變
  189.         int contourNum = cvFindContours(pImageBw1,storage,&first_contour,
  190.                 sizeof(CvContour), CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);
  191.        
  192.         //freeman鏈碼
  193.         //輪廓的存儲容器1(Cxcore動態(tài)結(jié)構(gòu))
  194.         CvMemStorage* storage1 = cvCreateMemStorage(0);
  195.         //輸出參數(shù):包含第一個輸出輪廓的指針
  196.         CvSeq* first_contour1 = 0;
  197.         IplImage* pImageBw2 = cvCloneImage(pImageBw);
  198.         //在二值圖像中尋找freeman鏈碼輪廓(Cv圖像處理)//注意pImgBw1會被改變
  199.         int contourNum1 = cvFindContours(pImageBw2,storage1,&first_contour1,
  200.                 sizeof(CvChain), CV_RETR_EXTERNAL,CV_CHAIN_CODE);
  201.        
  202.         //輪廓圖
  203.         IplImage* image = cvCloneImage(pImageBw);
  204.         cvSet(image,cvScalarAll(0),0);
  205.         //將所有輪廓畫出(Cxcore繪圖函數(shù))   
  206.     cvDrawContours(image, first_contour, CV_RGB(255,255,255), CV_RGB(255,255,255),2, 1, 0);
  207.         cvNamedWindow( "輪廓圖");
  208.         cvShowImage( "輪廓圖", image);
  209.         cvWaitKey(0);
  210.        
  211.         //獲取freeman鏈碼
  212.         CvSeqReader reader;
  213.        
  214.         //用于顯示外接矩形
  215.         IplImage* image1 = cvCreateImage(cvGetSize(pImageBw),IPL_DEPTH_8U,3);
  216.        
  217.         for(CvSeq* contour = first_contour,*contour1 = first_contour1;
  218.         contour != 0,contour1 != 0;contour=contour->h_next,contour1=contour1->h_next)
  219.         {
  220.                
  221.                 cvSet(image,cvScalarAll(0),0);
  222.                 cvDrawContours(image,contour,CV_RGB(255, 255, 255),CV_RGB(255, 255, 255),0, CV_FILLED, 8);
  223.         //        cvShowImage( "輪廓圖", image);
  224.                
  225.                 cout << "輪廓點數(shù):" << contour->total << '\t';
  226.                 //(Cv結(jié)構(gòu)分析)
  227.                 cout << "周長:" << cvArcLength(contour) << '\t';
  228.                
  229.                 //自己計算周長
  230.                 //(Cxcore動態(tài)結(jié)構(gòu))
  231.                 cvStartReadSeq((CvSeq*)contour1, &reader, 0 );
  232.                 double perimeter = 0;
  233.                 for(int cNum = 0; cNum < contour->total; cNum ++ )
  234.                 {
  235.                         char code;
  236.                         //獲取鏈碼
  237.                         CV_READ_SEQ_ELEM(code, reader);
  238.                         //鏈碼為偶數(shù)則周長+1
  239.                         if(int(code) % 2 == 0)
  240.                         {
  241.                                 perimeter += 1;
  242.                         }
  243.                         //鏈碼為奇數(shù),則周長+sqrt(2)
  244.                         if(int(code) % 2 != 0)
  245.                         {
  246.                                 perimeter += sqrt(2);
  247.                         }
  248.                 }
  249.                 cout << "計算的周長:" << perimeter << '\t';
  250.                
  251.                 cout << "面積:" << fabs(cvContourArea(contour)) << '\t';
  252.                 cout << "輪廓內(nèi)非0點數(shù):" << cvCountNonZero(image) << '\t';
  253.         //        cvWaitKey(0);
  254.                
  255.                 //最小外接矩形圖
  256.                 cvSet(image1,cvScalarAll(0),0);
  257.                 cvDrawContours(image1,contour,CV_RGB(255, 255, 255),CV_RGB(255, 255, 255),0, CV_FILLED, 8);
  258.                 //對給定2D點集,尋找最小面積的外圍矩形(Cv結(jié)構(gòu)分析)
  259.                 CvBox2D box = cvMinAreaRect2(contour,NULL);

  260.                 cout << "中心坐標(biāo):(" << box.center.x << "," << box.center.y << ")" << '\t';
  261.                 cvSet2D(image1,box.center.y,box.center.x,CV_RGB(0, 0, 255));
  262.                 cout << "長:" << (box.size.height > box.size.width?box.size.height:box.size.width) << '\t';
  263.                 cout << "寬:" << (box.size.height > box.size.width?box.size.width:box.size.height) << '\t';

  264.                 //繪制外接最小矩形  
  265.                 CvPoint2D32f pt[4];
  266.                 //尋找盒子的頂點(Cv結(jié)構(gòu)分析)
  267.                 cvBoxPoints(box,pt);  
  268.                 for(int i = 0;i < 4; ++ i)
  269.                 {  
  270.                         //(Cxcore繪圖函數(shù)、Cxcore基礎(chǔ)結(jié)構(gòu))
  271. ……………………

  272. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
代碼.docx (17.08 KB, 下載次數(shù): 31)

評分

參與人數(shù) 1黑幣 +1 收起 理由
owl1521 + 1 很給力!

查看全部評分

回復(fù)

使用道具 舉報

ID:216861 發(fā)表于 2017-7-3 17:38 | 顯示全部樓層
謝謝                                                         
回復(fù)

使用道具 舉報

ID:256027 發(fā)表于 2017-12-1 11:52 | 顯示全部樓層
想試試,這個程序編譯沒問題吧?
回復(fù)

使用道具 舉報

ID:270146 發(fā)表于 2018-1-2 13:36 | 顯示全部樓層
正在研究圖像輪廓問題,方法值得借鑒。
回復(fù)

使用道具 舉報

ID:105534 發(fā)表于 2018-8-14 15:22 | 顯示全部樓層
先看看
回復(fù)

使用道具 舉報

ID:401842 發(fā)表于 2018-10-19 09:30 | 顯示全部樓層
看看先
回復(fù)

使用道具 舉報

ID:490934 發(fā)表于 2019-3-14 17:54 | 顯示全部樓層
問下樓主能不能將這個程學(xué)放到的電腦上用?我給錢
聯(lián)系我:465539798@qq.com
回復(fù)

使用道具 舉報

ID:490934 發(fā)表于 2019-3-14 17:54 | 顯示全部樓層
能不能幫我編譯
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 罗宾被扒开腿做同人网站 | 超碰电影 | 一级大黄 | 国产亚洲成av人片在线观看桃 | aaaa网站 | 精品九九九 | 伊人激情综合网 | 国产精品一区二区av | 国产免费av在线 | 亚洲网一区| www.色综合 | 国产在线精品一区二区三区 | 国产一区二区视频免费在线观看 | 成人精品福利 | 中文字幕免费视频 | 天天干免费视频 | 日日噜噜夜夜爽爽狠狠 | 国产精品久久久久久久免费观看 | 国产精品久久久久久久久久免费看 | 亚洲精品一区二区另类图片 | 最新国产视频 | 日韩高清一区二区 | 欧美人成在线视频 | 亚洲一区二区av | 网页av| 日韩一区二区三区视频 | 国产一级在线 | 国产精品国产精品国产专区不片 | 亚洲欧美视频 | 精品视频一区二区三区在线观看 | 免费视频久久久久 | 亚洲免费一区二区 | 视频国产一区 | 日韩电影中文字幕 | 国产区久久 | 亚洲国产中文在线 | 一区二区视频在线 | 免费成人高清在线视频 | 韩国久久 | 色婷婷久久久亚洲一区二区三区 | 国产福利小视频 |