2017-04-18 12 views
0

私はopenCV 2.4.9を使用しています。新しいウィンドウでOpenCV run cameraを使ってカメラを開きます。私はキーを押すとカメラの色を変えたい。たとえば、 '1'をクリックしてグレースケールに変更すると、 '2' - >白黒、 '3' - > HSV、 'ESC'を押すと戻ります(0)。これは私がこれまでやってきたもの:OpenCVリアルタイムカラーカメラでの色の変更

#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); 
} 

私は(それが不可能な場合)各カラーフィルタ用に同じウィンドウまたはに何度も何度も開閉窓を色を変更します。ありがとうございました。申し訳ありませんが悪い英語の

+1

代わりにIplImageを使用して、Matを使用しないでください。また、C++構文を使用します。 – PSchn

+0

私はMatを使用しようとしています。私はどのように私たちに変更の色のための同じ窓を –

+0

以下私の答えを参照してくださいわからない – PSchn

答えて

2

以下のコードで動作するはずです。それはthis OpenCVチュートリアルと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

私はブレークポイントのエラーでこれを取得しています。 OpenCVエラー:cv :: imshow、file .. \ .. \ .. \ .. \ opencv \ modules \ highgui \ src \ window.cpp行のアサーションに失敗しました(size.width> 0 && size.height> 0) 261 –

+0

デフォルトのケースを忘れました(コードを更新しました)。最初は最後は0で、convertedImageは未定義です! – PSchn

0

私はこれ(コンパイル)をチェックしていません..しかし、私はそれがあなたを助けることができると思います。

#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; 
}