const Mat& CmCurveEx::CalSecDer(int kSize, float linkEndBound, float linkStartBound) { Mat dxx, dxy, dyy; Sobel(m_img1f, dxx, CV_32F, 2, 0, kSize); Sobel(m_img1f, dxy, CV_32F, 1, 1, kSize); Sobel(m_img1f, dyy, CV_32F, 0, 2, kSize); double eigval[2], eigvec[2][2]; for (int y = 0; y < m_h; y++) { float *xx = dxx.ptr<float>(y); float *xy = dxy.ptr<float>(y); float *yy = dyy.ptr<float>(y); float *pOrnt = m_pOrnt1f.ptr<float>(y); float *pDer = m_pDer1f.ptr<float>(y); for (int x = 0; x < m_w; x++) { compute_eigenvals(yy[x], xy[x], xx[x], eigval, eigvec); pOrnt[x] = (float)atan2(-eigvec[0][1], eigvec[0][0]); //计算法线方向 if (pOrnt[x] < 0.0f) pOrnt[x] += PI2; pDer[x] = float(eigval[0] > 0.0f ? eigval[0] : 0.0f);//计算二阶导数 } } GaussianBlur(m_pDer1f, m_pDer1f, Size(3, 3), 0); normalize(m_pDer1f, m_pDer1f, 0, 1, NORM_MINMAX); NoneMaximalSuppress(linkEndBound, linkStartBound); return m_pDer1f; }
CMat& CmCurveEx::CalSecDer(CMat &img1f, int kSize) { AllocSpace(img1f.size()); Mat dxx, dxy, dyy; Sobel(img1f, dxx, CV_32F, 2, 0, kSize); Sobel(img1f, dxy, CV_32F, 1, 1, kSize); Sobel(img1f, dyy, CV_32F, 0, 2, kSize); double eigval[2], eigvec[2][2]; for (int y = 0; y < _h; y++){ float *xx = dxx.ptr<float>(y); float *xy = dxy.ptr<float>(y); float *yy = dyy.ptr<float>(y); float *pOrnt = _pOrnt1f.ptr<float>(y); float *pDer = _pDer1f.ptr<float>(y); for (int x = 0; x < _w; x++){ compute_eigenvals(yy[x], xy[x], xx[x], eigval, eigvec); pOrnt[x] = (float)atan2(-eigvec[0][1], eigvec[0][0]); //计算法线方向 if (pOrnt[x] < 0.0f) pOrnt[x] += PI2; pDer[x] = float(eigval[0] > 0.0f ? eigval[0] : 0.0f);//计算二阶导数 } } GaussianBlur(_pDer1f, _pDer1f, Size(3, 3), 0); return _pDer1f; }