菜鸟一只,求大神指教如何画出内轮廓

[复制链接]
查看11 | 回复5 | 2021-1-27 06:45:36 | 显示全部楼层 |阅读模式
有一块纯色的背景板,上面有一些不同颜色(但也是纯色)的物体。已经完成通过侦测物体的颜色,找出物体的具体坐标的程序。我现在想写一个逻辑相反的程序,就是通过侦测背景颜色从而找出背景板上物体的具体坐标。但是我在修改过程中,总是无法成功框出内轮廓,求大神指教


分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:45:36 | 显示全部楼层
intVISION_ProcessFrame(VisionRangerange,VisionRangerange1,VisionRangerange2,BlobCoord*blob,BlobCoord*blob1,char*gameplay,char*color)//sofar,maximumdetect3colors,return2blobcoornidate(yellow,blue&Red)
{
IplImage*imgHSV=cvCreateImage(cvGetSize(frame),IPL_DEPTH_8U,3);//dst
cvCvtColor(frame,imgHSV,CV_BGR2HSV);//cvThreshold

IplImage*imgThreshed=cvCreateImage(cvGetSize(frame),IPL_DEPTH_8U,1);//dsw
if(*color!='3')
{
switch(*color)
{
case'0':
cvInRangeS(imgHSV,cvScalar(range.Hmin,range.Smin,range.Lmin,0),cvScalar(range.Hmax,range.Smax,range.Lmax,0),imgThreshed);
break;
case'1':
cvInRangeS(imgHSV,cvScalar(range1.Hmin,range1.Smin,range1.Lmin,0),cvScalar(range1.Hmax,range1.Smax,range1.Lmax,0),imgThreshed);
break;
case'2':
cvInRangeS(imgHSV,cvScalar(range2.Hmin,range2.Smin,range2.Lmin,0),cvScalar(range2.Hmax,range2.Smax,range2.Lmax,0),imgThreshed);
break;
}
if(TuneMode==1)
{
cvShowImage("ColourDetection",imgThreshed);
}
}

unsignedchar*data_ts=(unsignedchar*)imgThreshed->imageData,*data_hsv=(unsignedchar*)imgHSV->imageData;
intstep_ts=imgThreshed->widthStep/sizeof(unsignedchar),step_hsv=imgHSV->widthStep/sizeof(unsignedchar);
intchanels_hsv=imgHSV->nChannels;
inta,b;
unsignedcharH,S,V;
intmaxX[6]={0},maxY[6]={0};
into,p,q;
LoadValueColor(range,range1,range2);
for(a=0;aheight;a++)//cutwindowinY[0,240].ifnot,imgHSV->heightreadfromaboveis240
for(b=0;bwidth;b++)//cutwindowinX[0,320]examplefor(b=30;b=min[0]&&H=min[1]&&S=min[2]&&V=min1[0]&&H=min1[1]&&S=min1[2]&&V=min2[0]&&H=min2[1]&&S=min2[2]&&V=min3[0]&&H=min3[1]&&S=min3[2]&&Vh_next)
{
area1=fabs(cvContourArea(contour,CV_WHOLE_SEQ,1));
if(area150000)
{
cvSeqRemove(contour,0);
continue;
}
total=0;
total_S=0;
total_V=0;
for(l=0;ltotal;++l)
{
pt=(CvPoint*)cvGetSeqElem(contour,l);
H=data_hsv[step_hsv*pt->y+chanels_hsv*pt->x+0];
S=data_hsv[step_hsv*pt->y+chanels_hsv*pt->x+1];
V=data_hsv[step_hsv*pt->y+chanels_hsv*pt->x+2];
total=H+total;
total_S=S+total_S;
total_V=V+total_V;
}
avg=total/(contour->total);
avg_S=total_S/(contour->total);
avg_V=total_V/(contour->total);

if((avg>=min[0])&&(avg=min[1])&&(avg_S=min[2])&&(avg_VXmin=rect.x/2;
blob->Xmax=(rect.x+rect.width)/2;
blob->Ymin=rect.y;
blob->Ymax=rect.y+rect.height;
}
else
{
blob->Xmin=255;
blob->Xmax=255;
blob->Ymin=255;
blob->Ymax=255;
}
break;
}

回复

使用道具 举报

千问 | 2021-1-27 06:45:36 | 显示全部楼层
RegionFunctions
Thefollowingfunctionsareusedwithregions.

CombineRgn
CreateEllipticRgn
CreateEllipticRgnIndirect
CreatePolygonRgn
CreatePolyPolygonRgn
CreateRectRgn
CreateRectRgnIndirect
CreateRoundRectRgn
EqualRgn
ExtCreateRegion
FillRgn
FrameRgn
GetPolyFillMode
GetRegionData
GetRgnBox
InvertRgn
OffsetRgn
PaintRgn
PtInRegion
RectInRegion
SetPolyFillMode
SetRectRgn


回复

使用道具 举报

千问 | 2021-1-27 06:45:36 | 显示全部楼层



我是想用opencv来检测背景的黄色,从而框出黑色物体,并进一步得到黑色物体的具体坐标
回复

使用道具 举报

千问 | 2021-1-27 06:45:36 | 显示全部楼层
区别是否空洞,一般是用节点按逆时针/顺时针。
回复

使用道具 举报

千问 | 2021-1-27 06:45:36 | 显示全部楼层
不明白,可以说详细点吗
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行