OpenCV 연결 영역 구현
의문 이나 저작권 문제 가 있 으 면 원작 자 에 게 이동 하거나 본인 에 게 알려 주 십시오.
일반적인 인접 지역 을 옮 겨 다 니 는 방법 이나 두 번 의 스 캔 방법 등 상세 한 다른 방법 은 이 글 에서 찾 을 수 있 습 니 다.
OpenCV 연결 도 메 인 분석 및 태그
1. 빌 린 코드:
//
typedef struct MyConnectedComp
{
double area;
int value;
RECT rect;
list<POINT> listAllPoint;
}MyConnectedComp
/*
* :
* :src, ;rectSrc, ;listData, ;nUnionColor, (0, ;1, );nUnionMode, (0, 4 ;1, 8 )
* :int 。-1, ;0, /
*/
int ImageUnionByFloodFill(CxImage *src,RECT rectSrc,list<MyConnectedComp> &listData,int nUnionColor,int nUnionMode)
{
int nRet = 1;
//
if(src==NULL || !(nUnionColor==0||nUnionColor==1) || !(nUnionMode==1||nUnionMode==2) || (rectSrc.left==0 && rectSrc.right==0 || rectSrc.top==0 && rectSrc.bottom==0 || rectSrc.left>rectSrc.right || rectSrc.top>rectSrc.bottom))
{
nRet = -1;
return nRet;
}
if(src->GetBpp()>8)
{
nRet = 0;
return nRet;
}
listData.clear();
int nColor = 255;
if(nUnionColor==0)
{
nUnionColor = 255;
}
if(nUnionColor==1)
{
nUnionColor = 0;
}
int nFlag = 4;
if(nUnionMode==1)
{
nFlag = 4;
}
if(nUnionMode==2)
{
nFlag = 8;
}
int iBackColor = GetBlackColor(*src);
long i = 0,j = 0;
long m = 0,n = 0,newN = 0,newM = 0;
long nWidth = 0,nHeight = 0;
IplImage *pcvImageTmp = NULL;
if(!Cximage2IplImage(src,&pcvImageTmp))
{
return 0;
}
// ,
if(src->GetBpp()!=1)
{
cvThreshold(pcvImageTmp,pcvImageTmp,128,255,CV_THRESH_BINARY);
}
CvSize size = cvGetSize(pcvImageTmp);
DatumnConnectedComp dccTmp;
CvConnectedComp comp;
CvPoint seed;
for(j=rectSrc.top;j<rectSrc.bottom;j++)
{
for(i=rectSrc.left;i<rectSrc.right;i++)
{
if(i<0 || i>=size.width || j<0 || j>=size.height)
{
continue;
}
uchar *p = (uchar *)&(pcvImageTmp->imageData+j*pcvImageTmp->widthStep)[i];
if(*p==nUnionColor || *p==100 || *p==101)
{
continue;
}
// ,
seed = cvPoint(i,j);
cvFloodFill(pcvImageTmp, seed,cvScalarAll(100), cvScalarAll(0),cvScalarAll(0), &comp, nFlag, 0 );
dccTmp.area = comp.area;
dccTmp.rect.left = comp.rect.x;
dccTmp.rect.top = comp.rect.y;
dccTmp.rect.right = comp.rect.x + comp.rect.width;
dccTmp.rect.bottom = comp.rect.y + comp.rect.height;
dccTmp.value = int(comp.value.val[1]);
dccTmp.listAllPoint.clear();
POINT ptInsert;
for(n=0;n<=comp.rect.height;n++)
{
for(m=0;m<comp.rect.width;m++)
{
newN = n + comp.rect.y;
newM = m + comp.rect.x;
if(newN>=size.height || newM>=size.width)
{
continue;
}
uchar *q = (uchar *)&(pcvImageTmp->imageData+newN*pcvImageTmp->widthStep)[newM];
if(*q==100)
{
ptInsert.x = newM;
ptInsert.y = newN;
dccTmp.listAllPoint.push_back(ptInsert);
*q = 101;// ,
}
}
}
listData.push_back(dccTmp);
}
}
cvReleaseImage(&pcvImageTmp);
return nRet;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.