[opencv] 图像处理常用函数

1、cvThreshold二值化

cvThreshold(image,image,100,255,CV_THRESH_BINARY_INV);固定阀值二值化,阀值为100

cvThreshold(image2,image2,255,255,CV_THRESH_OTSU);//自适应二值化

很多时候,需要对图像进行黑白颠倒的操作,以下代码可以实现

for I := 0 to image2.width - 1 do
begin
for J := 0 to image2.height - 1 do
begin
if image2.imageData[I+round(J*image2.widthStep)]=255 then
image2.imageData[I+round(J*image2.widthStep)]:=0
else image2.imageData[I+round(J*image2.widthStep)]:=255;
end;
end;

 

2、cvCanny

cvCanny(srcmage,dstimage,3,9,3);// 3为第一个阈值threshold1,9为第二个阈值threshold2,最后一个参数一般默认为3

 

3、cvMorphologyEx   形态学运算

CrossLineWidth:=10;  // CrossLineWidth:Integer;

KernelWidth := Round(CrossLineWidth/2);//KernelWidth :double;

 if ((Round(KernelWidth) mod 2) = 0) then KernelWidth := KernelWidth - 1;

ConvKernel := cvCreateStructuringElementEx(Round(KernelWidth),
Round(KernelWidth),Floor(KernelWidth/2),Floor(KernelWidth/2),CV_SHAPE_ELLIPSE);//ConvKernel: pIplConvKernel; 参数CV_SHAPE_ELLIPSE表示椭圆形

cvMorphologyEx(Image2,Image2,nil,ConvKernel,CV_MOP_OPEN); //CV_MOP_OPEN表示开运算,还有闭运算,腐蚀,膨胀,顶帽,黑帽操作等

cvReleaseStructuringElement(ConvKernel);

 

4、cvFindContours  查找边界

Contour:= cvCreateMemStorage();//Contour: pCvMemStorage;

Contoursnumber:=cvFindContours(Image2, Contour, @FirstContour, SizeOf(TCvContour),CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE, cvPoint(0,0));//Contoursnumber:integer,表示找到的轮廓数,FirstContour: PCvSeq;存放着轮廓的信息,Image2必须为单通道的图像,否则会报错

 

之后,往往还需要找出最大的轮廓

Contoursnumber:=0;//Contoursnumber:integer;
while FirstContour<>nil do
begin
if FirstContour.total>Contoursnumber then
begin
Contoursnumber:= FirstContour.total;
SeqMax:=FirstContour;//SeqMax: PCvSeq,存放着最大轮廓的信息
end;
FirstContour:=FirstContour.h_next;
end;

//最后将最大轮廓的位置点坐标保存下来

ContourPointList:=Tlist<TCvPoint>.Create;
for idx := 0 to SeqMax.total - 1 do
begin
tempoint:=cvGetSeqElem(SeqMax,idx);//tempoint:pCvPoint;ContourPoint:TCvPoint;
ContourPoint.x:=tempoint.x;
ContourPoint.y:=tempoint.y;
ContourPointList.Add(ContourPoint);
end;

 

5、cvDrawContours    找到最大的轮廓信息后,往往需要画出轮廓

cvDrawContours(Image2, SeqMax, CV_RGB(255,255,255), CV_RGB(255, 255, 255), 0, 1, 8,cvPoint(0,0));//尤其注意0这个参数,如果是0,只绘制contour;

如果是1,将绘制contour后和contour同层的所有轮廓;如果是2,绘制contour后所有同层和低一层的轮廓,以此类推;如果值是负值,则函数并不绘制contour后的轮廓,但是将画出其子轮廓,一直到abs(max_level) - 1层。

 

6、cvHoughCircles

Circlestorage := cvCreateMemStorage();//Circlestorage:pCvMemStorage;

Circles:=cvHoughCircles(srcmage,Circlestorage,CV_HOUGH_GRADIENT,1.5,200,80,20,300,600);//Circles: pCvSeq;

for idx := 0 to Circles.total - 1 do  //提取出 找到的圆的 圆心和半径,并画出来
begin
pt3d := cvGetSeqElem(Circles, Idx);//pt3d: pCvPoint3D32f;
center.x:= round(pt3d.x);  //center:TCvPoint;
center.y:= round(pt3d.y);
CircleRadius:= round(pt3d.z);//CircleRadius:Integer;
cvCircle(dstimage,center,CircleRadius,cv_RGB(255,255,255),1);
end;
cvShowImage('显示找到的圆',dstimage);

 

7、cvEqualizeHist    直方图均值化函数

cvEqualizeHist(srcimage,dstimage);//这是这么个函数,输入图像和输出图像,就这么简单

  

posted on 2016-02-20 13:46  hust-阿超  阅读(627)  评论(0编辑  收藏  举报

导航