Когда я запускаю этот код в LabVIEW, он не отвечает, и я не получаю никаких ошибок. Что я должен делать?

Для некоторого фона я компилирую в Visual Studio 2019 и запускаю код в LabVIEW 2017. Причина, по которой я делаю это в LabVIEW, заключается в исследовании управления роботизированным порталом. Это система технического зрения, и она должна обнаруживать прямоугольники.

Следующий код - моя проблема. Я новичок в C++ и программировании в целом. Я выполнил шаг для каждой строки внутри LabVIEW, и когда он перестает отвечать, это когда он начинает захватывать nominalHeight, xfov и т. д. ... или просто когда он переходит в функцию WBPdetection в целом.

Там, где я думаю, что это может пойти не так, возможно, это не помещает rectWidth и rectHeight в вектор. Возможно, ему не нравятся четные пиксели (когда он делит на 2 части). Другая проблема может заключаться в том, что петля имеет неправильный размер при рисовании контуров. Но я не уверен, как выяснить, является ли это реальной проблемой или нет, поскольку я не получаю сообщения об ошибке.

#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;
}

person jfwinston32    schedule 15.01.2021    source источник
comment
Отвечает ли это на ваш вопрос? Labview не отвечает, когда Я запускаю этот код. Проблема с кодом C++ или проблема с Labview?   -  person Christoph Rackwitz    schedule 16.01.2021