OpenCV Python->;C++;:小数精度和散度 我目前正尝试用OpenCV翻译C++中的Python图像检测算法(以在智能手机应用程序中使用)。 我在某一点上有类似的结果,由于图像中的小差异的累积,这两种算法似乎有分歧:我在图像上应用了一些变换,但是Python中的十进制数字的数量远远大于C++(我使用CVY64 FC1矩阵),所以我在迭代之后得到了越来越多不同的结果
你对如何克服这个问题有什么想法吗 提前感谢:) 编辑:下面是一段代码,它在Python和C中给出了不同的结果++OpenCV Python->;C++;:小数精度和散度 我目前正尝试用OpenCV翻译C++中的Python图像检测算法(以在智能手机应用程序中使用)。 我在某一点上有类似的结果,由于图像中的小差异的累积,这两种算法似乎有分歧:我在图像上应用了一些变换,但是Python中的十进制数字的数量远远大于C++(我使用CVY64 FC1矩阵),所以我在迭代之后得到了越来越多不同的结果,python,c++,opencv,significant-digits,Python,C++,Opencv,Significant Digits,你对如何克服这个问题有什么想法吗 提前感谢:) 编辑:下面是一段代码,它在Python和C中给出了不同的结果++ void conv2(const Mat &img, const Mat& kernel, Mat& dest) { Mat source = img; Point anchor(kernel.cols - kernel.cols/2 - 1, kernel.rows - kernel.rows/2 - 1); flip(kernel, kerne
void conv2(const Mat &img, const Mat& kernel, Mat& dest) {
Mat source = img;
Point anchor(kernel.cols - kernel.cols/2 - 1, kernel.rows - kernel.rows/2 - 1);
flip(kernel, kernel, 0);
filter2D(source, dest, -1, kernel, anchor);
}
void myFunc() {
Mat im = imread("3.png", IMREAD_GRAYSCALE);
im.convertTo(im, CV_64F);
int rows = im.rows;
int cols = im.cols;
int sze = 7;
Mat gauss = getGaussianKernel(sze, 1);
Mat f = gauss * gauss.t();
Mat fx, fy;
Sobel(f, fx, -1, 1, 0);
Sobel(f, fy, -1, 0, 1);
Mat Gx, Gy, Gxx, Gyy, Gxy;
filter2D(im, Gx, -1, fx);
filter2D(im, Gy, -1, fy);
pow(Gx, 2, Gxx);
pow(Gy, 2, Gyy);
Gxy = Gx.mul(Gy);
gauss = getGaussianKernel(sze, 38);
f = gauss * gauss.t();
conv2(Gxx, f, Gxx);
conv2(Gyy, f, Gyy);
conv2(Gxy, f, Gxy);
Gxy *= 2;
Mat Gxx_minus_Gyy = Gxx - Gyy;
Mat Gxy_squared, Gxx_minus_Gyy_squared;
pow(Gxy, 2, Gxy_squared);
pow(Gxx_minus_Gyy, 2, Gxx_minus_Gyy_squared);
Mat denom;
sqrt(Gxy_squared + Gxx_minus_Gyy_squared, denom);
// denom += numeric_limits<double>::epsilon();
Mat sin2theta = Gxy / denom;
cout.precision(dbl::max_digits10);
cout << fixed << sum(sin2theta) << endl;
exit(1);
}
调用MyType()调用“Sn2theta”矩阵中的元素和:Python给出86587.44928456949,C++给出8625.0550545 1805947 814,这开始产生了非常重要的差异。< /P>你真的需要在第十二(或类似的)十进制数字之后的精度吗?我不想寻找特定的精度,我认为这两个算法的结果是由Python和C++之间的精度差异引起的…请显示相关的代码,Python ADNC++都确定你看到的是C++的全精度值吗?关于信息,我使用了以下答案:好的,现在我可以检查散度的确切来源,非常感谢@Miki。你真的需要第12位(或类似的)小数后的精度吗?我不需要具体的精度,我认为这两个算法的结果是由Python和C++之间的精度差异引起的…请显示相关的代码,Python ADNC++都确定你看到的是C++的全精度值吗?关于信息,我使用了以下答案:好的,现在我可以检查分歧的确切来源,非常感谢@Miki。
def conv2(img, kernel):
source = img
kernel = cv2.flip(kernel, 0)
rows, cols = kernel.shape
anchor = (int(cols - cols/2 - 1), int(rows - rows/2 - 1))
return cv2.filter2D(source, -1, kernel, anchor=anchor)
def myFunc():
im = cv2.imread('3.png', cv2.IMREAD_GRAYSCALE)
im = np.float64(im)
rows, cols = im.shape;
sze = 7
gauss = cv2.getGaussianKernel(sze, 1);
f = gauss * gauss.T;
fx = cv2.Sobel(f, -1, 1, 0)
fy = cv2.Sobel(f, -1, 0, 1)
Gx = cv2.filter2D(im, -1, fx)
Gy = cv2.filter2D(im, -1, fy)
Gxx = cv2.pow(Gx,2);
Gyy = cv2.pow(Gy,2);
Gxy = cv2.multiply(Gx, Gy);
gauss = cv2.getGaussianKernel(sze, 38);
f = gauss * gauss.T;
Gxx = conv2(Gxx, f)
Gyy = conv2(Gyy, f)
Gxy = 2*conv2(Gxy, f)
Gxx_minus_Gyy = Gxx - Gyy
Gxy_squared = cv2.pow(Gxy, 2)
Gxx_minus_Gyy_squared = cv2.pow(Gxx_minus_Gyy, 2)
denom = cv2.sqrt(Gxy_squared + Gxx_minus_Gyy_squared)
# denom += np.finfo(float).eps;
sin2theta = Gxy/denom
print(cv2.sumElems(sin2theta))
exit()