#include <iostream>
#include<vector>
#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui_c.h>
#include<imgproc/imgproc.hpp>
#include<core/core.hpp>
using namespace std;
using namespace cv;
Mat src, src_cv, src_sp, src_end, dst;
float min_area = 1.0;
RotatedRect rect;
Rect rect_first;
Point currentCenter;
vector<RotatedRect>rect_marry;
double max(double first, double second);
double min(double first, double second);
Point2f marry();
int main(int argc, char** argv)
{
double a[100], b[100];
int num = 0;
src = imread("C:/Users/cycqq/Desktop/chengguo/1.jpg");
blur(src, src, Size(3, 3), Point(-1, -1), 4);
cvtColor(src, src_cv, CV_BGR2GRAY);
threshold(src_cv, dst, 200, 255, THRESH_BINARY);
Mat structureElement = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
dilate(dst, dst, structureElement, Point(-1, -1), 1);
vector<Mat>S;
split(src, S);
src_sp = S[0] - S[2];
inRange(src_sp, 100, 180, src_sp);
dilate(src_sp, src_sp, structureElement, Point(-1, -1), 1);
src_end = src_sp & dst;
morphologyEx(src_end, src_end, MORPH_CLOSE, structureElement);
Canny(src_end, src_end, 50, 150, 3);
vector<vector<Point>>contours;
vector<Vec4i>hireachy;
vector<RotatedRect>rect_marry;
Point2f point[4];
findContours(src_end, contours, hireachy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
for (int i = 0; i < hireachy.size(); i++)
{
rect = minAreaRect(contours.at(i));
rect.points(point);
/* rect_first = boundingRect(contours.at(i));
if (rect_first.width < rect_first.height/2.5 )
{
rectangle(src, rect_first, Scalar(255, 0, 255), 2, LINE_8);
}*/
if (rect.size.width < (rect.size.height / 2.5))
{
rect_marry.push_back(rect);
}
}
marry();
imshow("Shlimazl", src);
waitKey(0);
return 0;
}
double max(double first, double second)
{
return first > second ? first : second;
}
double min(double first, double second)
{
return first < second ? first : second;
}
Point2f marry()//匹配灯条
{
RotatedRect leftrect, rightrect;
vector<int*>level_end;
double area[2], distence;
for (int j = 0; j < rect_marry.size(); ++j)
{
for (int k = j + 1; k < rect_marry.size(); ++k)
{
int level = 0;
int temp[3];
leftrect = rect_marry[j];
rightrect = rect_marry[k];
if (leftrect.angle == rightrect.angle)
{
level += 10;
}
else if (abs(leftrect.angle - rightrect.angle) < 10)
{
level += 8;
}
else if (abs(leftrect.angle - rightrect.angle) < 20)
{
level += 6;
}
else if (abs(leftrect.angle - rightrect.angle) < 30)
{
level += 4;
}
else if (abs(leftrect.angle - rightrect.angle) < 40)
{
level += 2;
}
else break;
area[0] = leftrect.size.width * leftrect.size.height;
area[1] = rightrect.size.width * rightrect.size.height;
if (area[0] == area[1])
{
level += 10;
}
else if (min(area[0], area[1]) * 2 > max(area[0], area[1]))
{
level += 8;
}
else if (min(area[0], area[1]) * 3 < max(area[0], area[1]))
{
level += 6;
}
else if (min(area[0], area[1]) * 4 < max(area[0], area[1]))
{
level += 4;
}
else if (min(area[0], area[1]) * 5 < max(area[0], area[1]))
{
level += 2;
}
else break;
double height = (leftrect.size.height + rightrect.size.height) / 2;
if (leftrect.center.y == rightrect.center.y)
{
level += 10;
}
else if (abs(leftrect.center.y - rightrect.center.y) < 0.1 * height)
{
level += 8;
}
else if (abs(leftrect.center.y - rightrect.center.y) < 0.2 * height)
{
level += 6;
}
else if (abs(leftrect.center.y - rightrect.center.y) < 0.3 * height)
{
level += 4;
}
else if (abs(leftrect.center.y - rightrect.center.y) < 0.4 * height)
{
level += 2;
}
else break;
if ((abs(leftrect.center.x - rightrect.center.x) / 2.5 * height) == 1)
{
level += 10;
}
else if ((abs(leftrect.center.x - rightrect.center.x) / 2.5 * height) > 0.9)
{
level += 8;
}
else if ((abs(leftrect.center.x - rightrect.center.x) / 2.5 * height) > 0.8)
{
level == 6;
}
else if ((abs(leftrect.center.x - rightrect.center.x) / 2.5 * height) > 0.7)
{
level += 4;
}
else if ((abs(leftrect.center.x - rightrect.center.x) / 2.5 * height) > 0.6)
{
level += 2;
}
else break;
temp[0] = j;
temp[1] = k;
temp[2] = level;
level_end.push_back(temp);
}
}
int maxlevel = 0, index = 0;
for (int C = 0; C < level_end.size(); ++C)
{
if (level_end[C][2] > maxlevel)
{
maxlevel = level_end[C][2];
index = C;
}
}
currentCenter.x = (rect_marry[level_end[index][0]].center.x + rect_marry[level_end[index][1]].center.x) / 2;
currentCenter.x = (rect_marry[level_end[index][0]].center.y + rect_marry[level_end[index][1]].center.y) / 2;
line(src, Point(currentCenter.x - 10, currentCenter.y - 10), Point(currentCenter.x + 10, currentCenter.y - 10), Scalar(255, 255, 0), 5, LINE_8);
line(src, Point(currentCenter.x + 10, currentCenter.y - 10), Point(currentCenter.x - 10, currentCenter.y - 10), Scalar(255, 255, 0), 5, LINE_8);
circle(src, currentCenter, 6.5, Scalar(0, 0, 255), 5);
imshow("Shlimazl1", src);
return currentCenter;
}
上文为代码,运行时提示我将无效参数传递的错误,大致应该是我的匹配函数问题,但是个人还是个新手,本身就对opencv理解不深,这个问题也是看的我云里雾里,希望有大佬能帮忙解决。
我的程序有点冗长。图片上传,只能幸苦大佬看文本了。
PS:marry函数中间都是判断矩形信息,模式相同,看一段应该即可。