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++ 为梯度计算中提供的单个图像并排生成4个图像的输出_C++_Opencv_Image Processing - Fatal编程技术网

C++ 为梯度计算中提供的单个图像并排生成4个图像的输出

C++ 为梯度计算中提供的单个图像并排生成4个图像的输出,c++,opencv,image-processing,C++,Opencv,Image Processing,下面的代码用于计算图像所有像素处的归一化梯度。但在计算梯度时使用imshow,而不是显示所提供图像的梯度,而是将所提供图像的梯度并排显示4次 #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" #include <opencv2/core/core.hpp> #include<iostream> #include<math.h> using namespac

下面的代码用于计算图像所有像素处的归一化梯度。但在计算梯度时使用imshow,而不是显示所提供图像的梯度,而是将所提供图像的梯度并排显示4次

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <opencv2/core/core.hpp>
#include<iostream>
#include<math.h>
using namespace cv;
using namespace std;
Mat mat2gray(const Mat& src)
{
    Mat dst;
    normalize(src, dst, 0.0, 1.0, NORM_MINMAX);
    return dst;
}
Mat setImage(Mat srcImage){

    //GaussianBlur(srcImage,srcImage,Size(3,3),0.5,0.5);
    Mat avgImage = Mat::zeros(srcImage.rows,srcImage.cols,CV_32F);
    Mat gradient = Mat::zeros(srcImage.rows,srcImage.cols,CV_32F);
    Mat norMagnitude = Mat::zeros(srcImage.rows,srcImage.cols,CV_32F);
    Mat orientation = Mat::zeros(srcImage.rows,srcImage.cols,CV_32F);
    //Mat_<uchar> srcImagetemp = srcImage;
    float dx,dy;
    for(int i=0;i<srcImage.rows-1;i++){
        for(int j=0;j<srcImage.cols-1;j++){
            dx=srcImage.at<float>(i,j+1)-srcImage.at<float>(i,j);
            dy=srcImage.at<float>(i+1,j)-srcImage.at<float>(i,j);
            gradient.at<float>(i,j)=sqrt(dx*dx+dy*dy);
            orientation.at<float>(i,j)=atan2(dy,dx);
            //cout<<gradient.at<float>(i,j)<<endl;
        }
    }

    GaussianBlur(gradient,avgImage,Size(7,7),3,3);
    for(int i=0;i<srcImage.rows;i++){
        for(int j=0;j<srcImage.cols;j++){
            norMagnitude.at<float>(i,j)=gradient.at<float>(i,j)/max(avgImage.at<float>(i,j),float(4));
            //cout<<norMagnitude.at<float>(i,j)<<endl;
        }
    }
imshow("b",(gradient));
waitKey();
return norMagnitude;    
}
int main(int argc,char **argv){
Mat image=imread(argv[1]);
cvtColor( image,image, CV_BGR2GRAY );
Mat newImage=setImage(image);
imshow("a",(newImage));
waitKey();

}

您传入的源图像的类型为CV_8UC1,但您将其读取为浮点数:

dx=srcImage.at<float>(i,j+1)-srcImage.at<float>(i,j);
dy=srcImage.at<float>(i+1,j)-srcImage.at<float>(i,j);
dx=(float)(srcImage.at<unsigned char>(i,j+1)-srcImage.at<unsigned char>(i,j));
dy=(float)(srcImage.at<unsigned char>(i+1,j)-srcImage.at<unsigned char>(i,j));