PageRenderTime 76ms CodeModel.GetById 28ms RepoModel.GetById 1ms app.codeStats 0ms

/OpenCV/cvtest2.c

https://github.com/i03nomura1y/Sample
C | 75 lines | 52 code | 11 blank | 12 comment | 9 complexity | e749c74c988de4e765b33d19f4c31e47 MD5 | raw file
  1. /// ヒストグラム
  2. // http://opencv.jp/sample/gradient_edge_corner.html
  3. // gcc -o cvtest cvtest.c -I/usr/local/include/opencv -L/usr/local/lib -lcxcore -lcv -lhighgui -lcvaux
  4. // gcc -o cvtest2 cvtest2.c `pkg-config --cflags --libs opencv`
  5. #include <stdio.h>
  6. #include <cv.h>
  7. #include <highgui.h>
  8. int main(int argc, char **argv){
  9. int i, j, bin_w;
  10. int hist_size = 256;
  11. int sch = 0, ch_width = 260;
  12. float max_value = 0;
  13. float range_0[] = { 0, 256 };
  14. float *ranges[] = { range_0 };
  15. IplImage *src_img = 0, *dst_img[4] = { 0, 0, 0, 0 }, *hist_img;
  16. CvHistogram *hist;
  17. // 画像ロード
  18. if(argc < 2 ||
  19. (src_img = cvLoadImage(argv[1], CV_LOAD_IMAGE_ANYCOLOR)) == 0){
  20. fprintf(stderr,"Usage: $ %s img_file\n",argv[0]);
  21. return -1;
  22. }
  23. // 入力画像のチャンネル数分の画像領域を確保
  24. sch = src_img->nChannels;
  25. for(i = 0; i < sch; i++) {
  26. dst_img[i] = cvCreateImage( cvSize(src_img->width, src_img->height),
  27. src_img->depth, 1);
  28. }
  29. // ヒストグラム構造体,ヒストグラム画像領域を確保
  30. hist = cvCreateHist(1, &hist_size, CV_HIST_ARRAY, ranges, 1);
  31. hist_img = cvCreateImage(cvSize(ch_width * sch, 200), 8, 1);
  32. // 入力画像がマルチチャンネルの場合,画像をチャンネル毎に分割
  33. if(sch == 1) cvCopy(src_img, dst_img[0], NULL);
  34. else cvSplit(src_img, dst_img[0], dst_img[1], dst_img[2], dst_img[3]);
  35. // ヒストグラム画像をクリア
  36. cvSet(hist_img, cvScalarAll(255), 0);
  37. for(i = 0; i < sch; i++) {
  38. // ヒストグラムを計算して,スケーリング
  39. cvCalcHist(&dst_img[i], hist, 0, NULL);
  40. cvGetMinMaxHistValue(hist, 0, &max_value, 0, 0);
  41. cvScale(hist->bins, hist->bins,((double) hist_img->height) / max_value, 0);
  42. // ヒストグラムの描画
  43. bin_w = cvRound((double) ch_width / hist_size);
  44. for(j = 0; j < hist_size; j++)
  45. cvRectangle(hist_img,
  46. cvPoint(j * bin_w +(i * ch_width), hist_img->height),
  47. cvPoint((j + 1) * bin_w +(i * ch_width),
  48. hist_img->height - cvRound(cvGetReal1D(hist->bins, j))),
  49. cvScalarAll(0), -1, 8, 0);
  50. }
  51. // ヒストグラム画像を表示,キーが押されたときに終了
  52. cvNamedWindow("Image", CV_WINDOW_AUTOSIZE);
  53. cvShowImage("Image", src_img);
  54. cvNamedWindow("Histogram", CV_WINDOW_AUTOSIZE);
  55. cvShowImage("Histogram", hist_img);
  56. cvWaitKey(0);
  57. cvDestroyWindow("Image");
  58. cvDestroyWindow("Histogram");
  59. cvReleaseImage(&src_img);
  60. cvReleaseImage(&hist_img);
  61. for(i = 0; i < sch; i++) cvReleaseImage(&dst_img[i]);
  62. cvReleaseHist(&hist);
  63. return 0;
  64. }