我想做一个dip::EuclideanSkeleton
。但是,当执行时,它会抛出一个 * 未处理的异常 *。返回类型和传递给函数的类型是否不匹配?如果是这样,我如何解决这个问题?我没有更多的猜测。如果没有dip::EuclideanSkeleton
,程序就可以工作了。
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <string>
#include "diplib.h"
#include "diplib/file_io.h"
#include "diplib/regions.h"
#include "diplib/display.h"
#include <dip_opencv_interface.h>
#include "diplib/binary.h"
int main() {
cv::Mat img = cv::imread("Cables.jpg", cv::IMREAD_GRAYSCALE);
if (img.empty()) {
return -1;
}
cv::Mat thresh = img.clone();
medianBlur(thresh, thresh, 7);
threshold(thresh, thresh, 127, 255, cv::THRESH_BINARY);
dip::Image image = dip_opencv::MatToDip(thresh);
dip::Image conv = dip::EuclideanSkeleton(image);
cv::Mat final = dip_opencv::DipToMat(conv);
cv::imshow("", final);
cv::waitKey(0);
}
在:
dataType_ {dt=UINT8 (1) } dip::DataType
输出:
dataType_ {dt=SFLOAT (9) } dip::DataType
- Skel_endpoints.exe中0x00007FF85A0F3B29处的未处理异常:Microsoft C++例外:dip::ParameterError at memory location 0x000000BAF730EDD8.*
1条答案
按热度按时间sbtkgmzw1#
问题是
dip::EuclideanSkeleton
需要一个二进制图像,但OpenCV不知道二进制类型。thresh
是8位无符号整数类型,当转换为DIPlib对象时,转换无法知道这是8位uint图像还是二进制图像。此外,OpenCV使用0和255的值来表示二进制图像,而DIPlib使用0和1的值。这是described in the documentation。解决方案是将8位uint图像强制为二进制。最简单的方法是简单地与零比较:
dip_opencv::MatToDip(thresh) > 0
。如果这样做,您可以跳过对cv::threshold
的调用。接下来,转换
dip_opencv::DipToMat(conv)
将生成CV_8U
图像,但包含值0和1,而不是其他OpenCV函数所期望的0和255。同样,一个简单的方法是将结果乘以255:dip_opencv::DipToMat(conv) * 255
。程序看起来像这样:
不幸的是,MSVC不会自动显示未捕获异常的
what()
字符串。我建议您在所有代码周围放置一个try
/catch
块,以便可以显示此字符串。DIPlib在抛出的异常中提供了有用的信息: