2017-04-18 5 views
0

Ich benutze openCV 2.4.9. Ich öffne die Kamera mit OpenCV in einem neuen Fenster. Ich möchte die Farben des Kamera-Feeds mit einem Tastendruck ändern. Zum Beispiel, wenn ich auf '1' Kamera-Feeds wechsle auf Graustufen, '2' -> schwarz und weiß, '3' -> HSV, und wenn ich 'ESC' drücke, zurück (0). Das, was ich kam so weit nach oben:OpenCV Farben ändern in Echtzeit Kamera-Feed

#include <iostream> 
#include <conio.h> 
using namespace std; 

#include<opencv\cv.h> 
#include<opencv\highgui.h> 
#include "opencv2\core\core.hpp" 
#include "opencv2\imgproc\imgproc.hpp" 


void main(){ 

    CvCapture *capture = cvCaptureFromCAM(CV_CAP_ANY); 
    IplImage *frame = 0, *image = 0; 
    int key = 0, last = 0; 

    cvNamedWindow("WebCamera", CV_WINDOW_AUTOSIZE); 

    while(key != 27) { 

      frame = cvQueryFrame(capture); 
      image = cvCloneImage(frame); 

     // i try to use swich and case for this but i can't get it work 
     // when using cvtColor need to use Mat image but when use cvShowImage need IplImage 
     // switch(last) 
     // { 
     //  case '1': 
     //   cvtColor(image,HSVimage,CV_BGR2HSV); 
     //  case '2': 
     //   cvtColor(image,HSVimage,CV_BGR2GRAY); 
     //  case '3': 
     //   . 
     //   . 
     //  default: break; 
     // } 


      cvShowImage("WebCamera", image); 
      cvReleaseImage(&image); 
      key = cvWaitKey(1); 
      if (key != -1) last = key; 
    } 
    cvDestroyWindow("WebCamera"); 
    cvReleaseCapture(&capture); 

    exit(0); 
} 

ich Farben ändern will immer wieder in demselben Fenster oder öffnen und schließen Fenster für jeden Farbfilter (wenn es nicht möglich ist). Danke. Sorry für schlecht Englisch

+1

Verwenden Sie nicht IplImage und nehmen Sie stattdessen Mat. Und benutze die C++ - Syntax. – PSchn

+0

Ich versuche, Mat zu verwenden. aber ich weiß nicht, wie wir dasselbe Fenster für Farben ändern –

+0

siehe meine Antwort unter – PSchn

Antwort

2

Es sollte mit dem folgenden Code funktionieren. Hab es von this OpenCV Tutorial und von der OpenCV documentation.

#include "opencv2/opencv.hpp" 
#include <iostream> 

using namespace cv; 
using namespace std; 

int main() 
{ 
    int key = 0, last = 0; 
    VideoCapture cap(0); // open the default camera 
    if(!cap.isOpened()) // check if we camera is opened 
    { 
     cout << "Cannot open selected camera" << endl; 
     return -1; 
    } 
    namedWindow("Capture",1); 
    Mat convertedImage; 

    for(;;) //Loop until user hit "esc" 
    { 
     Mat frame; 
     cap >> frame; // get a new frame from camera    

     switch(last) 
     { 
      case '1': 
      { 
       cvtColor(frame,convertedImage,CV_BGR2GRAY); 
       break; 
      } 
      case '2': //Binarization to generate Black/White image 
      { 
       Mat img_gray; 
       cvtColor(frame,img_gray,CV_BGR2GRAY); //First convert to gray 
       //Binarization. Use your parameters here or try adaptiveThreshold 
       threshold(img_gray, convertedIamge, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU); 
      } 
      case '3': 
      { 
       cvtColor(frame,convertedImage,CV_BGR2HSV); 
       break; 
      } 
      default: //use to prevent ecxeption at program start or use case '0' to show original image 
      { 
        convertedImage = frame; 
      } 
     } 

     imshow("Capture", convertedImage); //show converted image 

     key = waitKey(1); 
     if (key != -1)    
      last = key; 

     if(key == 27) 
      break;    

     // the camera will be deinitialized automatically in VideoCapture destructor 
    } 
    return 0; 
} 
+0

Ich bekomme das mit einem Breakpoint-Fehler. OpenCV-Fehler: Assertion fehlgeschlagen (size.width> 0 && size.height> 0) in cv :: imshow, Datei .. \ .. \ .. \ .. \ opencv \ modules \ highgui \ src \ window.cpp, Zeile 261 –

+0

Ich habe den Standardfall vergessen (den Code aktualisiert). Am Anfang ist zuletzt 0 und das konvertierte Bild ist undefiniert! – PSchn

0

Ich habe dies nicht überprüft (kompiliert) .. Aber ich denke, es kann Ihnen helfen.

#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/imgproc/imgproc.hpp> 
#include <iostream> 
using namespace cv; 
using namespace std; 

int main() { 
VideoCapture stream1(0); 

if (!stream1.isOpened()) { cout << "cannot open camera"; } 

while (true) { 
Mat cameraFrame; 
stream1.read(cameraFrame); 
switch(last) 
{ 
case '1': 
cvtColor(image,HSVimage,CV_BGR2HSV); 
break; 
case '2': 
cvtColor(image,HSVimage,CV_BGR2GRAY); 
break; 
case '3': 
...} 
imshow("cam", cameraFrame); 
key = cvWaitKey(1); 
if (key != -1) last = key; 
} 
return 0; 
}