#include <opencv4/opencv2/opencv.hpp>#include <iostream>
using namespace cv;using namespace std;void drawState(Mat &img,int number,Mat centroids,Mat stats,String str);
int main(){ Mat src=(Mat_<uchar>(6,6)<<0,0,0,0,255,0, 0,255,255,255,255,255, 0,255,255,255,255,0, 0,255,255,255,255,0, 0,255,255,255,255,0, 0,0,0,0,0,0); Mat struct1,struct2; struct1=getStructuringElement(0,Size(3,3)); struct2=getStructuringElement(1,Size(3,3)); Mat erodeSrc; erode(src,erodeSrc,struct2); namedWindow("src",WINDOW_GUI_NORMAL); namedWindow("erodeSrc",WINDOW_GUI_NORMAL); imshow("src",src); imshow("erodeSrc",erodeSrc); cout<<"文字腐蝕驗證"<<endl; waitKey(0);
Mat black=imread("/home/zja/Pictures/Black1.png"); Mat erode_black1,erode_black2; erode(black,erode_black1,struct1); erode(black,erode_black2,struct2); imshow("black",black); imshow("erode_black1",erode_black1); imshow("erode_black2",erode_black2); cout<<"驗證腐蝕對小連通域的去除"<<endl; waitKey(0);
Mat star=imread("/home/zja/Pictures/star.jpg"); Mat star2; copyTo(star,star2,star); Mat wink,winkBW; cvtColor(star,wink,COLOR_BGR2GRAY); threshold(wink,winkBW,50,255,THRESH_BINARY);
Mat out,stats,centroids; int number=connectedComponentsWithStats(winkBW,out,stats,centroids,8,CV_16U); drawState(star,number,centroids,stats,"未腐蝕時統計連通域");
erode(winkBW,winkBW,struct1); number=connectedComponentsWithStats(winkBW,out,stats,centroids,8,CV_16U); drawState(star2,number,centroids,stats,"腐蝕後統計連通域");
waitKey(0);return 0;}void drawState(Mat &img,int number,Mat centroids,Mat stats,String str){ RNG rng(10086); vector<Vec3b> colors; for(int i=0;i<number;i++) { Vec3b vec3=Vec3b(rng.uniform(0,256),rng.uniform(0,256),rng.uniform(0,256)); colors.push_back(vec3); } for(int i=1;i<number;i++) { int center_x=centroids.at<double>(i,0); int center_y=centroids.at<double>(i,1); int x=stats.at<int>(i,CC_STAT_LEFT); int y=stats.at<int>(i,CC_STAT_TOP); int w=stats.at<int>(i,CC_STAT_WIDTH); int h=stats.at<int>(i,CC_STAT_HEIGHT); circle(img,Point(center_x,center_y),2,Scalar(0,255,0),2,8,0); Rect rect(x,y,w,h); rectangle(img,rect,colors[i],1,8,0); putText(img,format("%d",i),Point(center_x,center_y),FONT_HERSHEY_SIMPLEX,0.5,Scalar(0,0,255),1); } imshow(str,img);}