Guest User

Untitled

a guest
May 22nd, 2018
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.17 KB | None | 0 0
  1. #include "StdAfx.h"
  2. #include "cv.h"
  3. #include "highgui.h"
  4. #include <stdio.h>  
  5. #include <Windows.h>
  6. #include <iostream>
  7.  
  8. using namespace std;
  9. using namespace cv;
  10. static int posX = 0;
  11. static int posY = 0;
  12.  
  13.  
  14. int lastX = posX;
  15. int lastY = posY;
  16.  
  17.  
  18. uchar*    ptr = NULL;
  19. int white_pixels = 255;
  20.  
  21. CvScalar lorange = cvScalar(120,120,30);
  22.  
  23. CvScalar hirange = cvScalar(170,150,50);
  24.  
  25. int average_x = posX;
  26. int average_y = posY;
  27.  
  28.  
  29. bool do_track = false;
  30. bool use_hsv = true;
  31.  
  32. int clicked_x = -1;
  33. int clicked_y = -1;
  34. void mousehandler( int event, int x, int y, int flags, void* param )
  35. {
  36.     clicked_x = -1;
  37.     if( event == CV_EVENT_LBUTTONDOWN )
  38.     {
  39.         clicked_x = x;
  40.         clicked_y = y;
  41.                 printf("clicked %d %d\n", x,y);
  42.     }
  43. }
  44.  
  45.  
  46. IplImage* GetThresholdedImage(IplImage* rec)
  47. {
  48.        
  49.         IplImage* GetThresholdedImage(IplImage* rec);
  50.         IplImage* recHSV = cvCreateImage(cvGetSize(rec), 8, 3);
  51.         cvCvtColor(rec, recHSV, CV_BGR2HSV);
  52.         IplImage* recThreshed = cvCreateImage(cvGetSize(rec), 8, 1);
  53.         cvInRangeS(recHSV,cvScalar(20,100,100),cvScalar(30,255,255), recThreshed);
  54.         cvReleaseImage(&recHSV);
  55.         return recThreshed;
  56. }
  57.  
  58. IplImage* GetThresholdedImageRGB(IplImage* rec)
  59. {
  60.         IplImage* recThreshed = cvCreateImage(cvGetSize(rec), 8, 1);
  61.         cvInRangeS(rec,cvScalar(20,100,100),cvScalar(30,255,255), recThreshed);
  62.         return recThreshed;
  63. }
  64.  
  65.  
  66. void GetPrimaryScreenSizeInPixels( SIZE& s)
  67. {
  68. ZeroMemory( &s, sizeof(SIZE) );
  69. s.cx = (LONG)::GetSystemMetrics( SM_CXFULLSCREEN );
  70. s.cy = (LONG)::GetSystemMetrics( SM_CYFULLSCREEN );
  71. }
  72.  
  73. int clamp(int v)
  74. {
  75.     if (v < 0 )
  76.         return 0;
  77.     if (v > 255)
  78.         return 255;
  79.  
  80.     return v;
  81. }
  82. CvMemStorage* storage = cvCreateMemStorage(0);
  83.  CvSeq* cont = cvCreateSeq(CV_SEQ_ELTYPE_POINT, sizeof(CvSeq), sizeof(CvPoint) , storage);
  84.  int main()
  85.  {
  86.  CvCapture* zaznam = cvCaptureFromCAM( CV_CAP_ANY); //zaznamenavanie z kamery
  87.  if ( !zaznam )
  88.  {
  89.      fprintf( stderr, "Chyba! zaznam je bez hodnoty \n ");
  90.      getchar();
  91.      return -1;
  92.  }
  93.  
  94.  
  95.  cvNamedWindow("video",CV_WINDOW_AUTOSIZE);
  96.  cvNamedWindow("thresh",CV_WINDOW_AUTOSIZE);
  97.  IplImage* recScribble = NULL;
  98.  IplImage* snimok = cvQueryFrame(zaznam);
  99.  cvSetMouseCallback("video", mousehandler );
  100.  
  101.  while (true)
  102.  {
  103.     snimok = cvQueryFrame(zaznam);
  104.         if (!snimok)
  105.          {
  106.              fprintf( stderr, "Chyba! snimok je bez hodnoty");
  107.              getchar();
  108.              break;
  109.          }
  110.        
  111.     cvFlip(snimok,snimok,1);
  112.     CvSize cs = cvGetSize(snimok);
  113.     int cam_w = cs.width;
  114.     int cam_h = cs.height;
  115.     int x;
  116.     int y;
  117.     IplImage* recYellowThreshold = use_hsv ? GetThresholdedImage(snimok) : GetThresholdedImageRGB(snimok);
  118.     if(do_track)
  119.      {
  120.      int av_x =0; int av_y = 0; int nwpix = 0;
  121.         for( int x=0; x < cam_w; x++)
  122.         {
  123.             for( int y=0; y < cam_h; y++)
  124.             {  average_x +=x; average_y += y; white_pixels ++; }
  125.         }
  126.    
  127.  
  128.    
  129.         cvFindContours(recYellowThreshold,storage,&cont,sizeof(CvContour), CV_RETR_EXTERNAL, 2, cvPoint(0,0));
  130.         if (cont != 0 )
  131.         {
  132.         CvRect r = cvBoundingRect(cont, 0 );
  133.         long screen_w = (LONG)::GetSystemMetrics( SM_CXFULLSCREEN );
  134.         long screen_h = (LONG)::GetSystemMetrics( SM_CYFULLSCREEN );
  135.  
  136.         posX = r.x*screen_w/cam_w;
  137.         posY = r.y*screen_h/cam_h;
  138.         SetCursorPos( (r.x + r.width / 2) *screen_w/cam_w,(r.y + r.height / 2)*screen_h/cam_h );
  139.         }
  140.     }
  141.         else
  142.         {
  143.            
  144.             if ( clicked_x != -1 )
  145.             {      
  146.                
  147.                 snimok->imageData[(clicked_x+clicked_y*cam_w)*3];
  148.                 snimok->imageData[(clicked_x+clicked_y*cam_w)*3 +1];
  149.                 char * pixel = (snimok->imageData +(clicked_x+clicked_y*cam_w)*3);  
  150.             }
  151.         }
  152.    
  153.         cvShowImage("thresh",recYellowThreshold);
  154.         cvShowImage("video",snimok);
  155.         int k = cvWaitKey(10);
  156.                 if ( k == 32) break;
  157.                 if ( k == '1' ) { use_hsv = true; printf("hsv\n"); }
  158.                 if ( k == '2' ) { use_hsv = false; printf("bgr\n"); }
  159.                 if ( k == '3' ) { do_track = true;printf("track on\n"); }
  160.                 if ( k == '4' ) { do_track = false; printf("track off\n"); }
  161.  }
  162.         cvReleaseCapture( &zaznam );
  163.         cvDestroyWindow ("Moje Okno");
  164.         return 0;
  165.  
  166.  }
Add Comment
Please, Sign In to add comment