OpenCV中文网站

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 安装 配置
查看: 679|回复: 4

OPENCV之細線化

[复制链接]
发表于 2013-10-31 16:52:25 | 显示全部楼层 |阅读模式
請教各位師兄弟:
在網路上都可以找到人家做好的cvThin(),
而我是參考http://blog.csdn.net/willyang519/article/details/8211689 的程式碼,
但每次執行時發會在有CV_IMAGE_ELEM(dst,byte,i,j)這一行顯示byte不存在,把它改成uchar,編譯程式碼沒錯誤,但執行時,我的目標二值圖根本沒執行細化的工作,
請問我還能參考哪些網站的做法(OPENCV為2.4.6)
還請各位師兄弟給我指點我迷惑ORZ
回复

使用道具 举报

发表于 2013-10-31 19:10:36 | 显示全部楼层
void ThinImage(IplImage* src, IplImage* dst, int iterations)
{
CvSize size = cvGetSize(src);

cvCopy(src, dst);//拷贝一个数组给另一个数组
    int n = 0,i = 0,j = 0;
for(n=0; n<iterations; n++)
{
IplImage* t_image;

t_image = cvCloneImage(dst);
  for(i=0; i<size.height;  i++)
  {
   for(int j=0; j<size.width; j++)
   {
    if(CV_IMAGE_ELEM(t_image,uchar,i,j)==1)
    {
     int ap=0;
     int p2 = (i==0)?0:CV_IMAGE_ELEM(t_image,uchar, i-1, j);
     int p3 = (i==0 || j==size.width-1)?0:CV_IMAGE_ELEM(t_image,uchar, i-1, j+1);
     if (p2==0 && p3==1)
     {
      ap++;
     }
     int p4 = (j==size.width-1)?0:CV_IMAGE_ELEM(t_image,uchar,i,j+1);
     if(p3==0 && p4==1)
     {
      ap++;
     }
     int p5 = (i==size.height-1 || j==size.width-1)?0:CV_IMAGE_ELEM(t_image,uchar,i+1,j+1);
     if(p4==0 && p5==1)
     {
      ap++;
     }
     int p6 = (i==size.height-1)?0:CV_IMAGE_ELEM(t_image,uchar,i+1,j);
     if(p5==0 && p6==1)
     {
      ap++;
     }
     int p7 = (i==size.height-1 || j==0)?0:CV_IMAGE_ELEM(t_image,uchar,i+1,j-1);
     if(p6==0 && p7==1)
     {
      ap++;
     }
     int p8 = (j==0)?0:CV_IMAGE_ELEM(t_image,uchar,i,j-1);
     if(p7==0 && p8==1)
     {
      ap++;
     }
     int p9 = (i==0 || j==0)?0:CV_IMAGE_ELEM(t_image,uchar,i-1,j-1);
     if(p8==0 && p9==1)
     {
      ap++;
     }
     if(p9==0 && p2==1)
     {
      ap++;
     }
     if((p2+p3+p4+p5+p6+p7+p8+p9)>1 && (p2+p3+p4+p5+p6+p7+p8+p9)<7)
     {
      if(ap==1)
      {
       if(p2*p4*p8==0)
       {
        if(p2*p6*p8==0)
        {
         CV_IMAGE_ELEM(dst, uchar,i,j)=0;
        }
       }
      }
     }                    
    }

   }

  }            
  cvReleaseImage(&t_image);

}

//将二值图像转换成灰度,以便显示
  i = 0;j = 0;
  size = cvGetSize(dst);
for(i=0; i<size.height;  i++)
{
  for(j=0; j<size.width; j++)
  {
   if(CV_IMAGE_ELEM(dst,uchar,i,j)==1)
   {
    CV_IMAGE_ELEM(dst,uchar,i,j) = 255;
   }
   else
   {
    CV_IMAGE_ELEM(dst,uchar,i,j) = 0;
   }
  }
}

}

你说的应该是这个吧。 可以细化 鉴定完毕
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-1 00:38:15 | 显示全部楼层
本帖最后由 loinjoe80 于 2013-11-1 01:07 编辑

感謝q1178kao大哥的回復,程式碼執行了工作,但好像跟網路上看到的範例圖不一樣,我執行時,它是把邊緣細化,而不是把整各物體細化。
網路找了許多相關例子,有看到這網站  迈克老狼2012 [size=1.8em] http://www.cnblogs.com/mikewolf2002/archive/2013/09/19/3329686.html

我比較不懂是怎樣才能執行函式 gThin::cvPavlidis(cv::Mat& src, cv::Mat& dst)

因為我是用Iplimage結構執行二值化,請問是要把 IplImage轉成cv::Mat   還是IplImage轉成CvMat? ,我轉過,但都失敗,還要再請教各位師兄弟。


感激不盡!!!
回复 支持 反对

使用道具 举报

发表于 2013-11-1 09:46:20 | 显示全部楼层
本帖最后由 q1178kao 于 2013-11-1 09:50 编辑

你可以把cvPavlidis改成用IplImage的。网上有IplImage 转cvMat、Mat,
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-3 21:25:15 | 显示全部楼层
各位師兄弟你好
我把  迈克老狼2012 [size=1.8em] http://www.cnblogs.com/mikewolf2 ... /09/19/3329686.html
這網站的程碼大概改成如此

void cvPavlidis(IplImage *src,IplImage *dst)
{
    CvMat *Matsrc,*Matdst;
    CvSize Size1;
    Size1=cvGetSize(&src);
    Matsrc=cvCreateMatHeader(Size1.height,Size1.width,CV_8UC1);
    Matdst=cvCreateMatHeader(Size1.height,Size1.width,CV_8UC1);

    cvGetMat(src,Matsrc);
    cvGetMat(dst,Matdst);
.............它本身的程碼,但只要式dst參數,都改成Matdst......
最後
cvGetImage(Matdst,dst);
}

但執行時都顯示
C:\Users\ccc_niu\Desktop\YCbCrtext\main.cpp|194|error: request for member 'type' in 'Matsrc', which is of pointer type 'CvMat*' (maybe you meant to use '->' ?)|
這錯誤,請問我哪裡寫錯了嗎?
回复 支持 反对

使用道具 举报

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

本版积分规则

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