将一个无效参数传递给了将无效参数视为严重错误的函数。opencv C++

#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函数中间都是判断矩形信息,模式相同,看一段应该即可。

 

这边建议你去Opencv官网拿处理demo照着写,不用自己想象写参数。

https://docs.opencv.org/4.5.2/examples.html

您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!

速戳参与调研>>>https://t.csdnimg.cn/Kf0y