我想计算灰度图像的梯度(代码中的smooth_plane),并将其绘制为OpenCV中的 vector 场,并叠加到现有图像上。如OpenCV文档中所述,我尝试应用一对Sobel运算符(我也尝试过Scharr)来计算x和y的两个导数,但是当我尝试绘制时, vector 场似乎是完全错误的。我想了解我的错误。我在这里放置了一些代码以使其更加清晰。在此先感谢您的帮助。//img is a gray-scale imageMat abs_grad_x, abs_grad_y, grad;Mat g_img;int ddepth = CV_16S;int scale = 1;int delta = 0;cvtColor(img,g_img,CV_GRAY2BGR);smoothed_plane = Mat::zeros(image_height,image_width,CV_8UC1);gradient_field = Mat::zeros(image_height,image_width,CV_32FC2);// Smooth the dominant plane by convolution with a GaussianGaussianBlur(dominant_plane,smoothed_plane,Size(51,51),image_height*image_width*0.5);/// Morphological opening (remove small objects from the foreground)erode(smoothed_plane, smoothed_plane, getStructuringElement(MORPH_ELLIPSE, Size(40+1,40+1)));dilate(smoothed_plane, smoothed_plane, getStructuringElement(MORPH_ELLIPSE, Size(40, 40)));/// Morphological closing (fill small holes in the foreground)dilate(smoothed_plane, smoothed_plane, getStructuringElement(MORPH_ELLIPSE, Size(40, 40)));erode(smoothed_plane, smoothed_plane, getStructuringElement(MORPH_ELLIPSE, Size(40, 40)));imshow("Eroded plane",smoothed_plane);/// Gradient XScharr( smoothed_plane, grad_x, ddepth, 1, 0, scale, delta, BORDER_DEFAULT );convertScaleAbs( grad_x, abs_grad_x );/// Gradient YScharr( smoothed_plane, grad_y, ddepth, 0, 1, scale, delta, BORDER_DEFAULT );convertScaleAbs( grad_y, abs_grad_y );for (int i = 0 ; i < image_height ; i ++){ for (int j = 0 ; j < image_width ; j ++){ gradient_field.at<Point2f>(Point2f(j,i)) = Point2f(abs_grad_x.at<float>(Point2f(j,i)),abs_grad_y.at<float>(Point2f(j,i))); }}for (int i = 0 ; i < image_height ; i += flowResolution){ for (int j = 0 ; j < image_width ; j+= flowResolution){ Point2f p(j,i); Point2f p2(gradient_field.at<Point2f>(p)+p); arrowedLine(g_img,p,p2,Scalar(0,0,255),1.5,8,0,0.1); }}//*/imshow("Gradient Vector Field", g_img);编辑:根据需要,这是我的输入/输出结果的一对框架 我尝试打印一些值,在某些情况下,我得到了非常高或非常低的值。再次感谢 最佳答案 我解决了我的问题。主要错误在于偏导数矩阵grad_x和grad_y的访问方法。如here所述,at。()方法返回一个Scalar对象,因此要使用像素强度值,应使用.val []字段。这是必须更改代码的方式:Scharr(smoothed_plane,grad_x,ddepth,1,0,scale);Scharr(smoothed_plane,grad_y,ddepth,0,1,scale);for (int i = 0 ; i < image_height ; i ++){ for (int j = 0 ; j < image_width ; j ++){ Scalar xval = grad_x.at<float>(i,j); Scalar yval = grad_y.at<float>(i,j); gradient_field.at<Point2f>(i,j) = Point2f(xval.val[0],yval.val[0]); }}这是预期的结果:关于c++ - 在OpenCV中绘制梯度 vector 场,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32907838/
10-11 21:12