异常在下面代码中标出了。不用看其他参数,直接第一个//hist开始看即可。异常是什么意思?
at()函数的定义是
template<typename _Tp> inline
_Tp& Mat::at(int i0, int i1)
{
CV_DbgAssert(dims <= 2);
CV_DbgAssert(data);
CV_DbgAssert((unsigned)i0 < (unsigned)size.p[0]);
CV_DbgAssert((unsigned)(i1 * DataType<_Tp>::channels) < (unsigned)(size.p[1] * channels())); //这行出现异常
CV_DbgAssert(CV_ELEM_SIZE1(DataType<_Tp>::depth) == elemSize1());
return ((_Tp*)(data + step.p[0] * i0))[i1];
}
*******************************
源代码
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
void histogram2Dcalculation(const Mat &src, Mat &histo2D)
{
Mat hsv;
cvtColor(src, hsv, CV_BGR2HSV);
int hbins = 255, sbins = 255;
int histSize[] = { hbins,sbins };
float hranges[] = { 0,180 };
float sranges[] = { 0,256 };
const float* ranges[] = { hranges,sranges };
MatND hist, hist2; //hist
int channels[] = { 0,1 };
calcHist(&hsv, 1, channels, Mat(), hist, 1, histSize, ranges, true, false); //hist
double maxVal = 0;
minMaxLoc(hist, 0, &maxVal, 0, 0); //hist
int scale = 1;
Mat histImg = Mat::zeros(sbins*scale, hbins*scale, CV_8UC3);
for (int h = 0;h < hbins;h++)
for (int s = 0;s < sbins;s++)
{
float binVal = hist.at<float>(h, s); //异常的地方,hist
int intensity = cvRound(binVal * 255 / maxVal);
rectangle(histImg, Point(h*scale, s*scale), Point((h + 1)*scale - 1, (s + 11)*scale - 1),
Scalar::all(intensity), CV_FILLED);
}
histo2D = histImg;
}
int main()
{
Mat src, imageq;
Mat histImg, histImgeq;
Mat histHSory, histHSeq;
src = imread("d:/lena.jpg");
if (!src.data)
{
printf("Error imagen \n");exit(1);
}
Mat bgr_planes[3];
split(src, bgr_planes);
histogram2Dcalculation(src, histImg);
imshow("H-S Histogram", histImg);
waitKey();
}