找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 10923|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

C語言魔方機(jī)器人用的顏色識(shí)別函數(shù)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:102014 發(fā)表于 2016-1-6 02:29 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
寫的很粗糙但非常實(shí)用
  1. void shibie(IplImage *pSrcImage,IplImage* img_d,Surface* m)
  2. {
  3. //通過一個(gè)IplImag對(duì)象識(shí)別一個(gè)魔方面的狀態(tài)img_d是通過去背景處理后的圖
  4.         IplImage *g_pGrayImage = NULL;  
  5.         CvSeq *g_pcvSeq = NULL;
  6. //////////////////////////////
  7.         //增強(qiáng)關(guān)鍵顏色
  8.         CvScalar s;
  9.     for(int i=0;i<pSrcImage->height;i++){
  10.         for(int j=0;j<pSrcImage->width;j++){
  11.         s=cvGet2D(pSrcImage,i,j);
  12.         
  13.                 if(s.val[2]>230&&s.val[1]>110&&s.val[1]<170&&s.val[0]<100&&s.val[0]>30)
  14.                 {
  15.                 //增強(qiáng)橙色
  16.         s.val[0]=50;
  17.         s.val[1]=140;
  18.         s.val[2]=250;
  19.         cvSet2D(pSrcImage,i,j,s);
  20.                 }else if(s.val[2]<25&&s.val[1]>140&&s.val[1]<200&&s.val[0]<120&&s.val[0]>50)
  21.                                 {
  22.                 //增強(qiáng)綠色
  23.         s.val[0]=90;
  24.         s.val[1]=170;
  25.         s.val[2]=0;
  26.         cvSet2D(pSrcImage,i,j,s);
  27.                 }else if(s.val[2]>0&&s.val[2]<29&&s.val[1]>36&&s.val[1]<70&&s.val[0]<220&&s.val[0]>170)
  28.                                 {
  29.                 //增強(qiáng)藍(lán)色
  30.         s.val[0]=190;
  31.         s.val[1]=50;
  32.         s.val[2]=10;
  33.         cvSet2D(pSrcImage,i,j,s);
  34.                 }else if(s.val[2]>220&&s.val[2]<250&&s.val[1]>170&&s.val[1]<210&&s.val[0]<20)
  35.                                 {
  36.                 //增強(qiáng)黃色
  37.         s.val[0]=10;
  38.         s.val[1]=190;
  39.         s.val[2]=220;
  40.         cvSet2D(pSrcImage,i,j,s);
  41.                 }
  42.         }
  43.     }
  44.         // 顯示顏色增強(qiáng)后原圖   
  45.     //cvNamedWindow("顏色增強(qiáng)后原圖", CV_WINDOW_AUTOSIZE);  
  46.     //cvShowImage("顏色增強(qiáng)后原圖", pSrcImage);
  47.     //////////////////////////////
  48.     //去除背景
  49.     for(i=0;i<pSrcImage->height;i++)
  50.         {
  51.         for(int j=0;j<pSrcImage->width;j++)
  52.                 {
  53.         s=cvGet2D(pSrcImage,i,j);
  54.         if(!((s.val[0]==50&&s.val[1]==140&&s.val[2]==250)||(s.val[0]==90&&s.val[1]==170&&s.val[2]==0)||(s.val[0]==190&&s.val[1]==50&&s.val[2]==10)||(s.val[0]==10&&s.val[1]==190&&s.val[2]==220)))
  55.                 {
  56.                 s.val[0]=0;
  57.         s.val[1]=0;
  58.         s.val[2]=0;
  59.         cvSet2D(pSrcImage,i,j,s);
  60.                 }
  61.                 }
  62.         }
  63.         // 轉(zhuǎn)為灰度圖   
  64.     g_pGrayImage =  cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1);  
  65.     cvCvtColor(pSrcImage, g_pGrayImage, CV_BGR2GRAY);  
  66.         // 轉(zhuǎn)為二值圖   
  67.     IplImage *pBinaryImage = cvCreateImage(cvGetSize(g_pGrayImage), IPL_DEPTH_8U, 1);  
  68.     cvThreshold(g_pGrayImage, pBinaryImage, 0, 255, CV_THRESH_BINARY);   
  69.     CvMemStorage* cvMStorage = cvCreateMemStorage();  
  70.     // 檢索輪廓并返回檢測(cè)到的輪廓的個(gè)數(shù)   
  71.     cvFindContours(pBinaryImage,cvMStorage, &g_pcvSeq,sizeof(CvContour),CV_RETR_EXTERNAL);  
  72.     IplImage *pOutlineImage = cvCreateImage(cvGetSize(g_pGrayImage), IPL_DEPTH_8U, 3);  
  73.     int _levels = 1;  
  74.     cvZero(pOutlineImage);  
  75.     cvDrawContours(pOutlineImage, g_pcvSeq, CV_RGB(255,0,0), CV_RGB(0,255,0), _levels);  
  76.     cvShowImage("pstrWindowsOutLineTitle", pOutlineImage);  
  77.     ////////////////////
  78.     //在原圖上繪制輪廓
  79.         //IplImage *pSrcImage = cvLoadImage("c:\\123.jpg", CV_LOAD_IMAGE_UNCHANGED);
  80.     cvDrawContours(pSrcImage, g_pcvSeq, CV_RGB(0,255,0), CV_RGB(0,255,0), _levels,3);  
  81.     //////////////////////////////
  82.     //通過輪廓定位并計(jì)算魔方塊坐標(biāo)
  83.         int x,y,x1,y1,H,W,D,x2,y2;
  84.         x=y=x1=y1=1;
  85.         int B=1;//跳出標(biāo)記
  86.         //找左上角
  87.     for(i=0;i<pSrcImage->height&&B==1;i++)
  88.         {
  89.         for(int j=0;j<pSrcImage->width&&B==1;j++)
  90.                 {
  91.         s=cvGet2D(pSrcImage,i,j);
  92.         if(s.val[2]==0&&s.val[1]==255&&s.val[0]==0)
  93.                 {
  94.                         y=i;
  95.                         B=0;
  96.                 }
  97.                 }
  98.         }
  99.         B=1;
  100.     for(int j=0;j<pSrcImage->width&&B==1;j++)
  101.                 {
  102.                 for(int i=0;i<pSrcImage->height&&B==1;i++)
  103.                 {
  104.                           s=cvGet2D(pSrcImage,i,j);
  105.         if(s.val[2]==0&&s.val[1]==255&&s.val[0]==0)
  106.                 {
  107.                         x=j;
  108.                         B=0;
  109.                 }
  110.                 }
  111.         }
  112.              //找右下角
  113.         B=1;
  114.     for(i=pSrcImage->height-1;i>=0&&B==1;i--)
  115.         {
  116.         for(int j=pSrcImage->width-1;j>=0&&B==1;j--)
  117.                 {
  118.         s=cvGet2D(pSrcImage,i,j);
  119.         if(s.val[2]==0&&s.val[1]==255&&s.val[0]==0)
  120.                 {
  121.                         y1=i;
  122.                         B=0;
  123.                 }
  124.                 }
  125.         }
  126.         B=1;
  127.     for(j=pSrcImage->width-1;j>=0&&B==1;j--)
  128.                 {
  129.                 for(i=pSrcImage->height-1;i>=0&&B==1;i--)
  130.                 {
  131.                           s=cvGet2D(pSrcImage,i,j);
  132.         if(s.val[2]==0&&s.val[1]==255&&s.val[0]==0)
  133.                 {
  134.                         x1=j;
  135.                         B=0;
  136.                 }
  137.                 }
  138.         }
  139.         
  140.            H=y1-y;
  141.                 W=x1-x;
  142.         D=(W+H)/6;
  143.         
  144.                 for(i=y+(D/2),y2=1;i<y1;i+=D,y2++)
  145.                         for(j=x+(D/2),x2=1;j<x1;j+=D,x2++)
  146.                         {
  147.                s=cvGet2D(pSrcImage,i,j);
  148.                if(s.val[0]==50&&s.val[1]==140&&s.val[2]==250) m->s[y2][x2]=(Colors)5;//橙色
  149.                if(s.val[0]==90&&s.val[1]==170&&s.val[2]==0) m->s[y2][x2]=(Colors)4;//綠色
  150.                           if(s.val[0]==190&&s.val[1]==50&&s.val[2]==10) m->s[y2][x2]=(Colors)2;//藍(lán)色
  151.                           if(s.val[0]==10&&s.val[1]==190&&s.val[2]==220) m->s[y2][x2]=(Colors)6;//黃色
  152.                cvSet2D(pSrcImage,i,j,s);
  153.                         }
  154.    
  155.         
  156.         s.val[0]=0;
  157.         s.val[1]=0;
  158.         s.val[2]=255;
  159.         cvSet2D(pSrcImage,y,x,s);
  160.         cvSet2D(pSrcImage,y1,x1,s);

  161.         for(i=y+(D/2);i<y1;i+=D)
  162.                         for(j=x+(D/2);j<x1;j+=D)
  163.                         {

  164.                cvSet2D(pSrcImage,i,j,s);
  165.                         }
  166.    
  167.     cvNamedWindow("定位矩形區(qū)域", CV_WINDOW_AUTOSIZE);  
  168.     cvShowImage("定位矩形區(qū)域", pSrcImage);
  169.         /////////////////////

  170.     cvReleaseMemStorage(&cvMStorage);  
  171.     cvReleaseImage(&pBinaryImage);  
  172.     cvReleaseImage(&pOutlineImage);  
  173. }
復(fù)制代碼



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:257174 發(fā)表于 2019-5-8 14:09 | 只看該作者
不好意思挖墳了!請(qǐng)問樓主這是什么開發(fā)環(huán)境?vs嗎?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表