opencv上的直方图
嘿,我试图做一个直方图,显示帧减法,代码正在运行,但我得到了灰色窗口没有结果。 命令窗口上的消息是: 编译器未对齐堆栈变量。Libavcodec编写错误 并且可能非常缓慢或崩溃。这不是libavcodec中的错误, 但是在编译器中。您可以尝试使用gcc>=4.2重新编译。 不要向FFmpeg开发人员报告崩溃。 OpenCV错误:在未知函数中断言失败(图像[j]。通道()==1), 文件……。\ocv\opencv\src\cv\cvhistogram.cpp,第137行 这是代码有人有想法吗?谢谢你的帮助opencv上的直方图,opencv,Opencv,嘿,我试图做一个直方图,显示帧减法,代码正在运行,但我得到了灰色窗口没有结果。 命令窗口上的消息是: 编译器未对齐堆栈变量。Libavcodec编写错误 并且可能非常缓慢或崩溃。这不是libavcodec中的错误, 但是在编译器中。您可以尝试使用gcc>=4.2重新编译。 不要向FFmpeg开发人员报告崩溃。 OpenCV错误:在未知函数中断言失败(图像[j]。通道()==1), 文件……。\ocv\opencv\src\cv\cvhistogram.cpp,第137行 这是代码有人有想法吗?谢
int main()
{
int key = 0;
CvCapture* capture = cvCaptureFromAVI( "macroblock.mpg" );
IplImage* frame = cvQueryFrame( capture );
IplImage* currframe = cvCreateImage(cvGetSize(frame),IPL_DEPTH_8U,3);
IplImage* destframe = cvCreateImage(cvGetSize(frame),IPL_DEPTH_8U,3);
IplImage* imgHistogram = 0;
CvHistogram* hist;
if ( !capture )
{
fprintf( stderr, "Cannot open AVI!\n" );
return 1;
}
int fps = ( int )cvGetCaptureProperty( capture, CV_CAP_PROP_FPS );
cvNamedWindow( "dest", CV_WINDOW_AUTOSIZE );
cvNamedWindow( "imgHistogram", CV_WINDOW_AUTOSIZE );
while( key != 'x' )
{
frame = cvQueryFrame( capture );
currframe = cvCloneImage( frame );
frame = cvQueryFrame( capture );
cvSub(frame,currframe,destframe);
int bins = 256;
int hsize[] = {bins};
float max_value = 0, min_value = 0;
float value;
int normalized;
float xranges[] = {0, 256};
float* ranges[] = {xranges};
IplImage* planes[] = {destframe};
hist = cvCreateHist(1, hsize, CV_HIST_ARRAY, ranges,1);
cvCalcHist(planes, hist, 0, NULL);
cvGetMinMaxHistValue(hist, &min_value, &max_value);
// printf("Minimum Histogram Value: %f, Maximum Histogram Value: %f\n", min_value, max_value);
imgHistogram = cvCreateImage(cvSize(bins, 50),IPL_DEPTH_8U,3);
cvRectangle(imgHistogram, cvPoint(0,0), cvPoint(256,50), CV_RGB(255,255,255),-1);
for(int i=0; i < bins; i++){
value = cvQueryHistValue_1D(hist, i);
normalized = cvRound(value*50/max_value);
cvLine(imgHistogram,cvPoint(i,50), cvPoint(i,50-normalized), CV_RGB(0,0,0));
}
if(key==27 )break;
cvShowImage( "dest",destframe);
cvShowImage( "imgHistogram",imgHistogram);
key = cvWaitKey( 1000 / 10 );
}
cvDestroyWindow( "dest" );
cvReleaseCapture( &capture );
return 0;
}
intmain()
{
int键=0;
CvCapture*capture=cvCaptureFromAVI(“macroblock.mpg”);
IplImage*frame=cvQueryFrame(捕获);
IplImage*currframe=cvCreateImage(cvGetSize(frame),IPL_DEPTH_8U,3);
IplImage*destframe=cvCreateImage(cvGetSize(frame),IPL_DEPTH_8U,3);
IplImage*imgHistogram=0;
cv直方图*hist;
如果(!捕获)
{
fprintf(标准“无法打开AVI!\n”);
返回1;
}
int fps=(int)cvGetCaptureProperty(捕获,CV_CAP_PROP_fps);
cvNamedWindow(“dest”,CV\u窗口\u自动调整大小);
cvNamedWindow(“imgHistogram”,CV\u WINDOW\u AUTOSIZE);
while(键!=“x”)
{
帧=cvQueryFrame(捕获);
currframe=cvCloneImage(帧);
帧=cvQueryFrame(捕获);
cvSub(帧、当前帧、目标帧);
int bins=256;
int hsize[]={bins};
浮动最大值=0,最小值=0;
浮动值;
int归一化;
浮点xranges[]={0,256};
浮点*范围[]={xranges};
IplImage*平面[]={destframe};
hist=cvCreateHist(1,hsize,CV_hist_数组,范围,1);
cvCalcHist(平面,历史,0,空);
cvGetMinMaxHistValue(历史、最小值和最大值);
//printf(“最小直方图值:%f,最大直方图值:%f\n”,最小值,最大值);
imgHistogram=cvCreateImage(cvSize(箱子,50),IPL_深度_8U,3);
cvRectangle(imgHistogram,cvPoint(0,0),cvPoint(256,50),CV_RGB(255255255),-1);
对于(int i=0;i
由于您试图显示1D直方图,因此直方图平面需要为灰度。因此,首先需要将结果图像从cvSub()
转换为灰度。试一试
IplImage *gray = NULL;
gray = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 1);
while(key != 'x') {
...
cvSub(frame, currframe, destframe);
cvCvtColor(destframe, gray, CV_BGR2GRAY);
...
IplImage* planes[] = {gray};
..
}
让我知道它是否适合您。由于您试图显示1D直方图,因此直方图平面需要为灰度。因此,首先需要将结果图像从
cvSub()
转换为灰度。试一试
IplImage *gray = NULL;
gray = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 1);
while(key != 'x') {
...
cvSub(frame, currframe, destframe);
cvCvtColor(destframe, gray, CV_BGR2GRAY);
...
IplImage* planes[] = {gray};
..
}
让我知道它是否适合你