找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9920|回复: 1
收起左侧

C语言魔方机器人用的颜色识别函数

[复制链接]
ID:102014 发表于 2016-1-6 02:29 | 显示全部楼层 |阅读模式
写的很粗糙但非常实用
  1. void shibie(IplImage *pSrcImage,IplImage* img_d,Surface* m)
  2. {
  3. //通过一个IplImag对象识别一个魔方面的状态img_d是通过去背景处理后的图
  4.         IplImage *g_pGrayImage = NULL;  
  5.         CvSeq *g_pcvSeq = NULL;
  6. //////////////////////////////
  7.         //增强关键颜色
  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.                 //增强橙色
  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.                 //增强绿色
  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.                 //增强蓝色
  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.                 //增强黄色
  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.         // 显示颜色增强后原图   
  45.     //cvNamedWindow("颜色增强后原图", CV_WINDOW_AUTOSIZE);  
  46.     //cvShowImage("颜色增强后原图", 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.         // 转为灰度图   
  64.     g_pGrayImage =  cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1);  
  65.     cvCvtColor(pSrcImage, g_pGrayImage, CV_BGR2GRAY);  
  66.         // 转为二值图   
  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.     // 检索轮廓并返回检测到的轮廓的个数   
  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.     //通过轮廓定位并计算魔方块坐标
  83.         int x,y,x1,y1,H,W,D,x2,y2;
  84.         x=y=x1=y1=1;
  85.         int B=1;//跳出标记
  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;//蓝色
  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("定位矩形区域", CV_WINDOW_AUTOSIZE);  
  168.     cvShowImage("定位矩形区域", pSrcImage);
  169.         /////////////////////

  170.     cvReleaseMemStorage(&cvMStorage);  
  171.     cvReleaseImage(&pBinaryImage);  
  172.     cvReleaseImage(&pOutlineImage);  
  173. }
复制代码



回复

使用道具 举报

ID:257174 发表于 2019-5-8 14:09 | 显示全部楼层
不好意思挖坟了!请问楼主这是什么开发环境?vs吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表