【问题标题】:OpenCV change colors in real time camera feedOpenCV 实时改变相机的颜色
【发布时间】:2017-04-18 21:52:28
【问题描述】:

我使用的是 openCV 2.4.9。我使用 OpenCV 在新窗口中运行相机打开相机。我想通过按键更改相机馈送的颜色。例如,当我单击“1”相机馈送变为灰度时,“2”-> 黑白,“3”-> HSV,当我按“ESC”时返回(0)。到目前为止,这是我想出的:

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

我想在同一个窗口中一次又一次地更改颜色,或者(如果不可能)为每个滤色器打开和关闭窗口。谢谢你。对不起英语不好

【问题讨论】:

  • 不要使用 IplImage 而是使用 Mat。并使用 c++ 语法。
  • 我尝试使用 Mat。但我不知道如何在同一个窗口中更改颜色
  • 在下面查看我的答案

标签: c++ opencv


【解决方案1】:

它应该与下面的代码一起使用。从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;
}

【讨论】:

  • 我遇到了断点错误。 OpenCV 错误:在 cv::imshow,文件 ..\..\..\..\opencv\modules\highgui\src\window.cpp,行中断言失败 (size.width>0 && size.height>0) 261
  • 我忘记了默认情况(更新了代码)。开头last为0,convertedImage未定义!
【解决方案2】:

我没有检查这个(编译)..但我认为它可以帮助你。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-11
    • 2018-04-15
    • 1970-01-01
    • 2016-07-27
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多