Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenCV结果在调试/发布和其他计算机上更改_C++_Opencv_Visual Studio 2015_Opencv3.0 - Fatal编程技术网

C++ OpenCV结果在调试/发布和其他计算机上更改

C++ OpenCV结果在调试/发布和其他计算机上更改,c++,opencv,visual-studio-2015,opencv3.0,C++,Opencv,Visual Studio 2015,Opencv3.0,我有一个程序,试图检测图像上的矩形物体(即太阳能组件)。为此,我使用C++和OpenCV 3和VisualStudio 2015更新1。p> 一般来说,我的程序使用了GaussianBlur->morphologyEx->Canny->HoughLines->findContours->approxPolyDP。因为,我很难找到最佳参数,我尝试运行许多参数组合以获得最佳参数设置 我遇到的问题是,“在Visual Studio中调试”、“使用生成的.exe进行调试”、“在Visual Studio

我有一个程序,试图检测图像上的矩形物体(即太阳能组件)。为此,我使用C++和OpenCV 3和VisualStudio 2015更新1。p> 一般来说,我的程序使用了
GaussianBlur
->
morphologyEx
->
Canny
->
HoughLines
->
findContours
->
approxPolyDP
。因为,我很难找到最佳参数,我尝试运行许多参数组合以获得最佳参数设置

我遇到的问题是,“在Visual Studio中调试”、“使用生成的.exe进行调试”、“在Visual Studio中发布”、“使用生成的.exe进行发布”之间的结果不同。另外,在其他计算机上再次运行.exe文件会更改结果

在同一台机器上以相同的设置运行程序不会改变结果(即,它似乎是确定性的)。程序中也没有并发(除了opencv中有一些我不知道的)

知道为什么不同设置之间存在如此巨大的不匹配吗(在一个设置中检测到99%精度的太阳能模块的参数组合在另一个设置中根本检测不到该模块)

编辑:

我试图创建一个最小的工作示例(见下文),其中包括代码,直到得到第一个不匹配(以后可能会有更多的不匹配)。我试图初始化我找到的每个变量

标识符
parameterset
是一个对象的实例,该对象包含我为找到最佳值而修改的所有参数。我检查了这些参数是否都已初始化,并且在调试和Relase中是相同的

使用此代码,由
writeIntermediateResultImage
创建的前3个图像(基本上只使用opencv方法
imwrite
,并且只指定图像存储到的路径)是相同的,但形态学图像不同(根据我发现的一些结果,相差13.43%)。一个区别是,在释放模式下,形态学图像的左边缘和上边缘对于某些像素是黑色的,但图像中也存在其他差异

编辑:在发布模式下运行生成的.exe文件的代码时,似乎根本不应用形态学算法,但图像只是向左和向下移动,在顶部和底部留下黑色边缘

编辑:此班次似乎取决于它所运行的机器。在我的笔记本电脑上,我的移动没有应用形态学,在我的桌面上,应用形态学没有移动和黑色边缘

void findSquares(const Mat& image, vector<vector<Point> >& squares, string srcName)
{
// 1) Get HSV channels
Mat firstStepResult(image.size(), CV_8U);
Mat hsvImage(image.size(), CV_8UC3);

// Convert to HSV space
cvtColor(image, hsvImage, CV_BGR2HSV);
writeIntermediateResultImage("HSV.jpg", hsvImage, srcName);

// Transform Value channel of HSV image to greyscale
Mat channel0Mat(image.size(), CV_8U);
Mat channel1Mat(image.size(), CV_8U);
Mat channel2Mat(image.size(), CV_8U);
Mat hsv_channels[3]{ channel0Mat, channel1Mat, channel2Mat };
split(hsvImage, hsv_channels);

firstStepResult = hsv_channels[parameterset.hsvChannel];
writeIntermediateResultImage("HSVChannelImage.jpg", firstStepResult, srcName);

// 2) Gaussian Denoising
Mat gaussImage = firstStepResult;
GaussianBlur(gaussImage, gaussImage, Size(parameterset.gaussKernelSize, parameterset.gaussKernelSize), 0, 0);
writeIntermediateResultImage("GaussianBlur.jpg", gaussImage, srcName);

// 3) Morphology
Mat morphologyImage = gaussImage;
morphologyEx(morphologyImage, morphologyImage, parameterset.morphologyOperator, Mat(parameterset.dilateKernelSize, parameterset.dilateKernelSize, 0), cv::Point(-1, -1), parameterset.numMorpholgies);
writeIntermediateResultImage("Morphology.jpg", morphologyImage, srcName);
}
void findSquares(常数矩阵和图像、向量和正方形、字符串名称)
{
//1)获取HSV频道
Mat firstStepResult(image.size(),CV_8U);
Mat hsvImage(image.size(),CV_8UC3);
//转换到HSV空间
CVT颜色(图像、图像、CV_BGR2HSV);
writeIntermediateResultImage(“HSV.jpg”,hsvImage,srcName);
//HSV图像灰度通道的变换
Mat channel0Mat(image.size(),CV_8U);
Mat channel1Mat(image.size(),CV_8U);
Mat channel2Mat(image.size(),CV_8U);
Mat hsv_信道[3]{channel0Mat、channel1Mat、channel2Mat};
分割(hsv图像、hsv_通道);
firstStepResult=hsv_通道[parameterset.hsvChannel];
writeIntermediateResultImage(“HSVChannelImage.jpg”,firstStepResult,srcName);
//2)高斯去噪
Mat gaussImage=第一步结果;
GaussianBlur(gaussImage,gaussImage,Size(parameterset.gausskernelize,parameterset.gausskernelize),0,0);
writeIntermediateResultImage(“GaussianBlur.jpg”,gaussImage,srcName);
//3)形态
Mat形态图像=高斯图像;
morphologyEx(MorphologyImages,MorphologyImages,parameterset.morphologyOperator,Mat(parameterset.DigitalKernelSize,parameterset.DigitalKernelSize,0),cv::Point(-1,-1),parameterset.Nummorphoges);
writeIntermediateResultImage(“Morphology.jpg”,morphologyImage,srcName);
}

我还检查了库路径,并且在正确的编译模式下使用了正确的库(使用“d”进行调试,发布时不使用)。

我在代码中发现了错误,现在在每个配置中都得到了相同的结果。问题是使用形态学操作符的行

morphologyEx(morphologyImage, morphologyImage, parameterset.morphologyOperator, Mat(parameterset.dilateKernelSize, parameterset.dilateKernelSize, 0), cv::Point(-1, -1), parameterset.numMorpholgies);
即使创建的
Mat
对象(
Mat(parameterset.digitalkernelsize,parameterset.digitalkernelsize,0)
)在调试中作为一个结构元素工作,但它在发行版中有点搞砸了一切

使用


结构元素起了作用。

我猜这是由未定义的行为引起的。例如在计算中使用未初始化变量的值。请提供一些代码来重现问题。您是否正确设置了include和lib路径?您知道调试文件有扩展名d,例如opencv_highgui300d.lib,而发布文件没有扩展名,例如opencv_highgui300.lib。
getStructuringElement(MORPH_RECT, Size(parameterset.dilateKernelSize, parameterset.dilateKernelSize))