?//顯示圖片
1
IplImage * src = cvLoadImage(
"
xx.JPG
"
);
2
cvNamedWindow(
"
show_image
"
,
1
);
3
cvShowImage(
"
show_image
"
,src);
4
cvWaitKey(
0
);
5
cvReleaseImage(&
str);
6
cvDestroyWindow(
"
show_image
"
);
?
?//色彩空間轉換,轉換類型為CV_BGR2GRAY
1
IplImage* dst = cvCreateImage(cvGetSize(src),src->depth,
1
);
2
cvCvtColor(src,dst,CV_BGR2GRAY);
3
?//開、閉、膨脹、腐蝕操作
1
IplConvKernel* element = cvCreateStructuringElementEx(
3
,
3
,
0
,
0
, CV_SHAPE_ELLIPSE,
0
);
//
創建3*3橢圓結構元素
2
IplImage * temp=cvCreateImage(cvGetSize(pGrayImg), IPL_DEPTH_8U,
1
);
3
cvMorphologyEx(pGrayImg,pGrayImg, temp, element,CV_MOP_CLOSE,
1
);
//
閉操作 先膨脹再腐蝕
4
cvMorphologyEx(pGrayImg,pGrayImg, temp, element,CV_MOP_OPEN,
1
);
//
開操作 先腐蝕再膨脹
5
cvReleaseStructuringElement(&
element);
6
cvReleaseImage(&
temp);
7
cvDilate( pGrayImg, pGrayImg, NULL,
1
);
//
膨脹
8
cvErode( pGrayImg, pGrayImg, NULL,
1
);
//
腐蝕
?
//邊緣檢測
cvCanny(pGrayImg,pGrayImg,
200
,
220
,
3
);
//
邊緣檢測
?
?
?
//二值圖像中檢索輪廓
1
int
cvFindContours( CvArr* image, CvMemStorage* storage, CvSeq** first_contour,
int
header_size=
sizeof
(CvContour),
int
mode=CV_RETR_LIST,
int
method=CV_CHAIN_APPROX_SIMPLE, CvPoint offset=cvPoint(
0
,
0
) );
http://blog.csdn.net/augusdi/article/details/9000893
?
//二值圖像中找圓、橢圓擬合
1
//
橢圓擬合
2
void
my_FitEllipse(CvSeq *pContour, CvBox2D *
box_rect)
3
{
4
CvMat*p=cvCreateMat(
1
,pContour->
total,CV_32FC2);
5
CvPoint2D32f *p_temp=(CvPoint2D32f*)(p->
data.fl);
6
7
for
(
int
i=
0
;i<pContour->total;i++
)
8
{
9
CvPoint*p0=(CvPoint*
)cvGetSeqElem(pContour,i);
10
*p_temp=cvPointTo32f(*
p0);
11
p_temp++
;
12
}
13
*box_rect =
cvFitEllipse2(p);
14
cvReleaseMat(&
p);
15
}
16
17
/*
18
*功能描述:
19
* 二值圖像中找圓形
20
*輸入:
21
* pStrimg - 原圖
22
* vCircle - 圓集合
23
*/
24
void
findCircle(IplImage *pStrImg, vector<Ccircle> &
vCircle)
25
{
26
CvSeq *pContour =
NULL;
27
CvSeq *pConInner =
NULL;
28
CvMemStorage *pStorage =
NULL;
29
IplImage *pTmpImg = cvCreateImage(cvGetSize(pStrImg), pStrImg->depth, pStrImg->
nChannels);
30
cvCopy(pStrImg, pTmpImg);
31
32
//
查找所有輪廓
33
pStorage = cvCreateMemStorage(
0
);
34
cvFindContours(pTmpImg, pStorage, &pContour,
sizeof
(CvContour), CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);
35
36
int
wai =
0
;
37
int
nei =
0
;
38
for
(; pContour != NULL; pContour = pContour->
h_next)
39
{
40
wai++
;
41
//
內輪廓循環
42
for
(pConInner = pContour->v_next; pConInner != NULL; pConInner = pConInner->
h_next)
43
{
44
nei++
;
45
}
46
if
(pContour->total <
5
)
47
{
48
//
TRACE("Number of points should be >= 5\n");
49
continue
;
50
}
51
CvBox2D box_rect;
52
my_FitEllipse(pContour, &
box_rect);
53
if
(fabs(box_rect.size.width - box_rect.size.height) <
1
){
//
橢圓長軸,短軸長度相近時判斷為圓
54
Ccircle circle;
55
circle.center.x =
box_rect.center.x;
56
circle.center.y =
box_rect.center.y;
57
circle.r = (box_rect.size.height + box_rect.size.width) /
4
;
58
vCircle.push_back(circle);
59
}
60
//
cvEllipseBox(pBinary, box_rect, CV_RGB(255, 255, 255));
61
TRACE(
"
center:%f,%f, w:%f, h:%f\n
"
, box_rect.center.x, box_rect.center.y, box_rect.size.width, box_rect.size.height);
62
63
//
CvRect rect = cvBoundingRect(pContour,0);
64
//
cvRectangle(pBinary, cvPoint(rect.x, rect.y), cvPoint(rect.x + rect.width, rect.y + rect.height),CV_RGB(255,255, 255), 1, 8, 0);
65
}
66
67
printf(
"
wai = %d, nei = %d
"
, wai, nei);
68
cvReleaseImage(&
pTmpImg);
69
cvReleaseMemStorage(&
pStorage);
70
pStorage =
NULL;
71
72
}
?
?
//圖像上點的訪問
1
uchar*
data ;
2
uchar*
ivs_data ;
3
//
IplImage*ivs_image = cvCreateImage(cvGetSize(gray_image),IPL_DEPTH_8U, 1);
4
5
ivs_height = dst->
height;
6
ivs_width = dst->
width;
7
ivs_step = dst->widthStep/
sizeof
(uchar);
8
ivs_channel = dst->
nChannels;
9
data = (uchar*)str->
imageData;
10
//
printf("Processing a %d X %d image with %d channel!\n",ivs_height,ivs_width,ivs_channel);
11
12
13
ivs_data = (uchar*)dst->
imageData;
14
15
16
//
反色圖像
17
for
(ivs_i=
0
;ivs_i<ivs_height;ivs_i++
)
18
{
19
for
(ivs_j=
0
;ivs_j<ivs_width;ivs_j++
)
20
{
21
for
(ivs_k=
0
;ivs_k<ivs_channel;ivs_k++
)
22
{
23
ivs_data[ivs_i*ivs_step+ivs_j*ivs_channel+ivs_k]=
255
-data[ivs_i*ivs_step+ivs_j*ivs_channel+
ivs_k];
24
25
26
}
//
k
27
}
//
j
28
}
//
i
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

