Shlimazl 2021-05-08 21:50 采纳率: 0%
浏览 49

将一个无效参数传递给了将无效参数视为严重错误的函数。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函数中间都是判断矩形信息,模式相同,看一段应该即可。

 

  • 写回答

3条回答 默认 最新

  • CSDN专家-Time 2021-05-09 08:13
    关注

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

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

    评论

报告相同问题?

悬赏问题

  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题