运行此代码时,LabVIEW无响应. C ++代码问题或LabVIEW问题? [英] LabVIEW not responding when I run this code. C++ code issue or LabVIEW issue?

查看:189
本文介绍了运行此代码时,LabVIEW无响应. C ++代码问题或LabVIEW问题?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在某些背景下,我正在Visual Studio 2019中进行编译,并在LabVIEW 2017中运行代码.之所以在LabVIEW中进行,是为了研究控制机械龙门.这是视觉系统,应该可以检测矩形(用于硅检测器的引线键合焊盘).

For some background, I am compiling in Visual Studio 2019 and running the code inside LabVIEW 2017. The reason I am doing it in LabVIEW is for research to control a robotic gantry. This is the vision system and it is supposed to detect rectangles (wirebond pads for silicon detectors).

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

I need it to atleast show me a picture or something but when I run it in LabVIEW, it just says it is not responding and makes me hard close the program. So frustrating! If theres no huge errors in my C++ code then I know I have to dig deeper into my LabVIEW code.

以下代码是我的问题.我对C ++和一般编程还是相当陌生的.我已经完成了LabVIEW内部每一行的步骤,当它停止响应时是它开始抓取nominalHeightxfov等...时,或者只是当它进入WBPdetection函数时.

The following code is my problem. I am fairly new to C++ and programming in general. I have done the step each line inside LabVIEW and when it stops responding is when it starts to grab the nominalHeight, xfov etc... or just when it goes into the WBPdetection function in general.

我们非常感谢您的帮助.或者,如果有人可以将我指向正确的方向.

Any help is much appreciated. Or if someone could just point me in the right direction.

#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相同的大小.

dimRects has zero size but your code treats it as if it has the same size as contours.

这篇关于运行此代码时,LabVIEW无响应. C ++代码问题或LabVIEW问题?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆