MATLAB代码到C++;(使用OPENCV) 有人能帮我把这个命令翻译成C++(opencv)?< /p>

MATLAB代码到C++;(使用OPENCV) 有人能帮我把这个命令翻译成C++(opencv)?< /p>,matlab,histogram,Matlab,Histogram,因此,在蒙版图像上需要2048个箱子的直方图,返回一个包含计数和箱子值的矩阵 我想您可以使用calcHist,甚至可以自定义它或构建自己的函数。 您需要知道如何访问数组元素、对数组的操作以及直方图的基本理论 你的问题隐藏了很多问题,因为Matlab的水平更高。分解你的问题,你会发现所有答案都分散在论坛中…对于Historogram,你可以使用以下课程(课程来自openCV 2计算机视觉书籍): 谢谢你的回答,但问题是ROI不是一个矩形,而是一个类似圆形的东西(但它不是)。此外,我使用了calcH

因此,在蒙版图像上需要2048个箱子的直方图,返回一个包含计数和箱子值的矩阵

我想您可以使用calcHist,甚至可以自定义它或构建自己的函数。 您需要知道如何访问数组元素、对数组的操作以及直方图的基本理论


你的问题隐藏了很多问题,因为Matlab的水平更高。分解你的问题,你会发现所有答案都分散在论坛中…

对于Historogram,你可以使用以下课程(课程来自openCV 2计算机视觉书籍):


谢谢你的回答,但问题是ROI不是一个矩形,而是一个类似圆形的东西(但它不是)。此外,我使用了calcHistogram,但我的源图像有一些负值。我试图将范围设置在0-255之间,但效果不好。是否可以使用2048个与256个灰度级别相关的存储单元来计算具有负值的图像的直方图?您可以生成一个1D图像,将圆形图像的像素值放入该1D图像中(或者更好地称为1D cv::Mat数组)。在我的函数中,有hranges[0]=minval;hranges[1]=maxval;你试过用这个吗?也许它也适用于负值。尝试使用我发布给你的类,我认为calchistogram是较旧的C风格函数;但我现在的问题是计算负片图像的组织图values@user1783116创建图像时使用IPL_DEPTH_8S。S=有符号U=无符号。
[h t] = hist(img(roi_mask>0),2048);
class Histogram1D{
private:
    int histSize[1];
    float hranges[2];
    const float* ranges[1];
    int channels[1];
    cv::MatND hist;
public:
    Histogram1D()
        {
        histSize[0] = 2048;
        hranges[0]=0.0;
        hranges[1] = 255.0;
        ranges[0] = hranges;
        channels[0] = 0;//by default, we look at channel 0
        }
    Histogram1D(float minval,float maxval)
        {
        histSize[0] = 2048;
        hranges[0]=minval;
        hranges[1] = maxval;
        ranges[0] = hranges;
        channels[0] = 0;//by default, we look at channel 0
        }

    //Hier wird die cv funktion zum bestimmen vom Histogramm gestartet
    cv::MatND calcHistogram(const cv::Mat &image){
        //compute histogram
        cv::calcHist(&image,
            1,         //histogram from 1 image only
            channels,  //the channel used
            cv::Mat(), //no mask is used
            hist,      //the resulting histogram
            1,         //it is a 1D histogram
            histSize,  //number of bins
            ranges     //pixel value range
            );
        return hist;
        }

    cv::MatND getHistogram(){


        return hist;
        }

    cv::Mat getHistogramImage(){
        //compute histogram first
        cv::MatND hist= getHistogram();

        //get min and max bin values
        double maxVal=0;
        double minVal=0;
        cv::minMaxLoc(hist, &minVal, &maxVal, 0,0);

        //Image on which to display histogram
        cv::Mat histImg(histSize[0]+40, histSize[0],CV_8U,cv::Scalar(255));

        //set highest point at 90% of nbins
        int hpt = static_cast<int>(0.9*histSize[0]);

        //Draw a vertical line for each bin
        for (int h=0;h<histSize[0];h++)
            {
            float binVal=hist.at<float>(h);
            int intensity = static_cast<int>(binVal*hpt/maxVal);

            //This function draws a line between 2 points
            cv::line(histImg,cv::Point(h,histSize[0]),cv::Point(h,histSize[0]-intensity),cv::Scalar::all(0));
            }

        //min und max val im Histogramm angeben
        char maxValStr[10],minValStr[10];
        sprintf (maxValStr, "%d",static_cast<int>(hranges[1]));
        sprintf (minValStr, "%d",static_cast<int>(hranges[0]));

        int fontFace = cv::FONT_HERSHEY_SCRIPT_SIMPLEX;
        double fontScale = 0.3;
        int thickness = 1;  
        cv::Point textOrgmax(histSize[0]-40, histSize[0]+20),textOrgmin(5, histSize[0]+20);

        cv::putText(histImg, maxValStr, textOrgmax, fontFace, fontScale, cv::Scalar::all(0), thickness,8);
        cv::putText(histImg, minValStr, textOrgmin, fontFace, fontScale, cv::Scalar::all(0), thickness,8);
        return histImg;
        }

    };
// Transform it into the C++ cv::Mat format
cv::Mat image(imagesource);

// Setup a rectangle to define your region of interest
cv::Rect myROI(10, 10, 100, 100);

// Crop the full image to that image contained by the rectangle myROI
// Note that this doesn't copy the data
cv::Mat croppedImage = image(myROI);


    cv::Mat tmp = croppedImage .clone();//clone image
        double min =0,max = 0;
    cv::minMaxLoc(tmp,&min,&max);

    cv::namedWindow("Histogram",CV_WINDOW_AUTOSIZE);
    Histogram1D h(min,max);
    h.calcHistogram(tmp);
    cv::imshow("Histogram",h.getHistogramImage());