调试/发布和其他计算机

时间:2016-04-22 15:25:08

标签: c++ opencv visual-studio-2015 opencv3.0

我有一个程序试图检测图像上的矩形对象(即太阳能模块)。为此我使用c ++与opencv 3和Visual Studio 2015 Update 1.

一般来说,我的程序使用GaussianBlur - > morphologyEx - > Canny - > HoughLines - > findContours - > approxPolyDP。因为,我有找到最佳参数的问题,我试图运行许多参数组合,以获得最佳参数设置。

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

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

任何想法为什么不同设置之间存在如此巨大的不匹配(在一个设置中检测太阳能模块的精度达到99%的参数组合在另一个设置中完全没有检测到模块)?。

编辑:

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

标识符paramterset是一个对象的实例,它包含我修改的所有参数以找到最佳值。我检查了那些参数都是初始化的,并且在Debug和Relase中是相同的。

使用此代码,由writeIntermediateResultImage创建的前3个图像(基本上只使用opencv方法imwrite并且仅指定图像存储到的路径)是相同的但形态图像不同(根据我发现的一些online image comparer,有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);
}

我还检查了库路径,并在正确的编译模式下使用了正确的库(使用'd'调试,不使用Release)。

1 个答案:

答案 0 :(得分:1)

我在代码中发现错误,现在每个配置都得到相同的结果。问题是使用形态学算子的线。

rd_kafka_list_groups()

即使创建的morphologyEx(morphologyImage, morphologyImage, parameterset.morphologyOperator, Mat(parameterset.dilateKernelSize, parameterset.dilateKernelSize, 0), cv::Point(-1, -1), parameterset.numMorpholgies); 对象(Mat)在Debug中作为结构元素工作,它也会破坏Release中的所有内容。

使用

Mat(parameterset.dilateKernelSize, parameterset.dilateKernelSize, 0)

作为结构元素的伎俩。