当我 运行 这段代码时,LabVIEW 没有响应。 C++ 代码问题还是 LabVIEW 问题?

LabVIEW not responding when I run this code. C++ code issue or LabVIEW issue?

对于某些背景,我在 Visual Studio 2019 年编译并 运行 在 LabVIEW 2017 中编译代码。我在 LabVIEW 中这样做的原因是为了研究控制机器人龙门架。这是视觉系统,它应该检测矩形(用于硅检测器的焊线焊盘)。

我需要它至少给我看一张照片或其他东西,但是当我在 LabVIEW 中 运行 它时,它只是说它没有响应并且让我很难关闭程序。太令人沮丧了!如果我的 C++ 代码中没有大错误,那么我知道我必须更深入地研究我的 LabVIEW 代码。

下面的代码是我的问题。一般来说,我对 C++ 和编程还很陌生。我已经在 LabVIEW 中完成了每一行的步骤,当它停止响应时是它开始获取 nominalHeightxfov 等...或者只是当它进入 WBPdetection 函数时一般。

非常感谢任何帮助。或者,如果有人可以指出正确的方向。

#include "stdafx.h"
#include "utils.h"
#include "WBPdetection.h"
#include "opencv2/opencv.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <vector>

using namespace std;

void show3(cv::Mat img)
{
    cv::namedWindow("MyWindow", cv::WINDOW_AUTOSIZE);
    cv::imshow("MyWindow", img);
    cv::waitKey(0);
    cv::destroyWindow("MyWindow");
}

__declspec(dllexport) int __cdecl WBPdetection(
    char* imgPtr, 
    int imgLineWidth, 
    int imgWidth, 
    int imgHeight, 
    double percent_size, 
    double nominalWidth, 
    double nominalHeight,
    double tolerance,
    double xfov,
    double yfov)
{
    cv::Mat img(imgHeight, imgWidth, CV_8U, (void*)imgPtr, imgLineWidth);
    cv::resize(img, img, cv::Size(img.cols * percent_size, img.rows * percent_size), 0, 0);

    //PREPPING IMAGE FOR DETECTION ALGORITHIM
    cv::threshold(img, img, 125, 255, cv::THRESH_OTSU);
    cv::GaussianBlur(img, img, cv::Size(5, 5), 0);
    cv::erode(img, img, cv::Mat(), cv::Point(-1, -1), 2, 1, 1); 
    cv::dilate(img, img, cv::Mat(), cv::Point(-1, -1), 1, 1, 1);
    
    //USE FIND CONTOURS ALGORITHIM
    vector<vector<cv::Point>> contours;
    vector<cv::Vec4i> hierarchy; 
    cv::findContours(img, contours, hierarchy, cv::RETR_TREE, cv::CHAIN_APPROX_SIMPLE); 
    for( int i = 0; i < contours.size(); i++ ) 
    {   approxPolyDP( cv::Mat(contours[i]), contours_poly[i], 3, true ); 
        boundRect[i] = cv::boundingRect( cv::Mat(contours_poly[i]) ); 
     }

    vector<vector<double>> dimRects; //ex [ [w1,h1], [w2,h2], [w3,h3], ...]
    vector<cv::Point> centerRects; //ex [ [c1], [c2], [c3], ... ]

    //PUTTING DIMENSIONS OF ALL RECTANGLES IN VECTORS
    for (int i = 0; i < contours.size(); i++)
    {
        cv::Point center = ((boundRect[i].tl().x + boundRect[i].br().x) / 2, (boundRect[i].tl().y + boundRect[i].br().y) / 2); //what about even pixels
        double rectWidth = (boundRect[i].br().x - boundRect[i].tl().x) * (xfov / img.cols); //might not matter tbh
        double rectHeight = (boundRect[i].tl().y - boundRect[i].br().y) * (yfov / img.rows);
        dimRects[i].push_back(rectWidth);
        dimRects[i].push_back(rectHeight);
        centerRects.push_back(center);
    }

    //DEFINING minWidth, etc... FROM tolerance AND nominalWidth
    double minWidth = nominalWidth * (1 - tolerance);
    double maxWidth = nominalWidth * (1 + tolerance);
    double minHeight = nominalHeight * (1 - tolerance);
    double maxHeight = nominalHeight * (1 + tolerance);

  // DRAWING CONTOURS AND BOUNDING RECTANGLE + CENTER
    for( int i = 0; i< dimRects.size(); i++ )
     {
       cv::Scalar color = cv::Scalar(255,255,255); //creates color
       if ((dimRects[i][0] > minWidth && dimRects[i][0] < maxWidth) && (dimRects[i][1] > minHeight && dimRects[i][1] < maxHeight)) 
       {
           drawContours(img, contours_poly, i, color, 1, 8, vector<cv::Vec4i>(), 0, cv::Point()); 
           rectangle(img, boundRect[i].tl(), boundRect[i].br(), color, 2, 8, 0); 
           circle(img, centerRects[i], 1, cv::Scalar(0, 0, 255), 1, cv::LINE_8);
       }
    }

    show3(img);
    return 0;
}

这里有一个错误

vector<vector<double>> dimRects; 
...
for (int i = 0; i < contours.size(); i++)
{
    ...
    dimRects[i].push_back(rectWidth);
    dimRects[i].push_back(rectHeight);

dimRects 的大小为零,但您的代码将其视为与 contours.

的大小相同