方块判别

2021-04-12 22:31:46  阅读：27  来源： 互联网

1. 转HSV图像（这里自己一个个试的阈值）
2. 腐蚀
3. 二值化
4. 找边框

`

``````#include <opencv2/opencv.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>

using namespace cv;
using namespace std;

String Path = "./2.jpg";
vector<Vec4i> hierarchy;
int main()
{
int niters = 6;int vmin = 126, vmax = 256, smin = 138;
//imshow("yuantu",Image);

GaussianBlur(src,Image,Size(5,5),1.5);

cvtColor(Image, dstImage1, COLOR_RGB2HSV);//这个是HSV的
//cvtColor(Image, dstImage1, COLOR_BGR2GRAY);
//imshow("11",dstImage1);
//dilate(dstImage1, dst, Mat(), Point(-1,-1),1);
erode(dstImage1,dst,Mat(),Point(-1,-1),niters);
//dilate(dst,dst,Mat(),Point(-1,-1),1);
inRange(dst, Scalar(0, smin, MIN(vmin,vmax)),

Mat kernel = getStructuringElement(MORPH_RECT, Size(5,5), Point(-1, -1));
vector<vector<Point> > contours0;
int idx = 0;

vector<vector<Point> > contours0_poly( contours0.size() );
vector<Rect> boundRect( contours0.size() );
vector<RotatedRect> r( contours0.size() );
//for( ; idx >= 0; idx = hierarchy[idx][0] )
//{
vector<Moments> mu(contours0.size());
for (int i = 0; i < contours0.size(); i++)
{
mu[i] = moments(contours0[i], false);
}
///  计算中心矩:
vector<Point2f> mc(contours0.size());
for (int i = 0; i < contours0.size(); i++)
{
mc[i] = Point2f(mu[i].m10 / mu[i].m00, mu[i].m01 / mu[i].m00);
}

for( size_t i = 0; i < contours0.size(); i++ )
{
approxPolyDP( contours0[i], contours0_poly[i], 3, true );
boundRect[i] = boundingRect( contours0_poly[i] );
Scalar color = Image.at<Vec3b>(mc[i]);
r[i] =minAreaRect(contours0_poly[i]);
//rectangle( Image, boundRect[i].tl(), boundRect[i].br(), color, 2 );
//rectangle( Image, {boundRect[i].x,boundRect[i].y}, {boundRect[i].x+boundRect[i].width,boundRect[i].y+boundRect[i].height}, color, 2 );
Mat boxPoints2f,boxPointsCov;
boxPoints(r[i], boxPoints2f);
boxPoints2f.assignTo(boxPointsCov,CV_32S);
polylines(Image, boxPointsCov, true,color,10);
if (color[0]>50&&color[0]<80&&color[1]>0&&color[1]<100&&color[2]>150&&color[2]<220)
putText(Image,"red",Point(mc[i]),FONT_HERSHEY_SIMPLEX,2,Scalar(0,0,255),4,8);
if (color[0]>50&&color[0]<80&&color[1]>150&&color[1]<220&&color[2]>100&&color[2]<120)
putText(Image,"green",Point(mc[i]),FONT_HERSHEY_SIMPLEX,2,Scalar(0,255,0),4,8);
if (color[0]>50&&color[0]<80&&color[1]>100&&color[1]<120&&color[2]>200&&color[2]<220)
putText(Image,"orange",Point(mc[i]),FONT_HERSHEY_SIMPLEX,2,Scalar(0,105,255),4,8);
if (color[0]>150&&color[0]<255&&color[1]>100&&color[1]<150&&color[2]>0&&color[2]<100)
putText(Image,"bule",Point(mc[i]),FONT_HERSHEY_SIMPLEX,2,Scalar(255,0,0),4,8);

//Scalar color( rand()&188, rand()&188, rand()&188 );
//drawContours( Image, contours0, -1, color,  3 );
circle(Image, mc[i], 4, Scalar(0,0,0), -1, 8, 0);
}

/(Image, mc[i], 4, color, -1, 8, 0);

//imshow("HSV",dstImage1);
imshow("HSV2",dst);

imshow("resoult",Image);
//imshow("con",contours0);
waitKey(0);
return 0;
}
``````

`