在打开的cv c ++中单击鼠标右键时如何从视频中捕获图像

Posted

技术标签:

【中文标题】在打开的cv c ++中单击鼠标右键时如何从视频中捕获图像【英文标题】:How to capture image from video when right button of mouse is clicked in open cv c++ 【发布时间】:2015-04-22 15:47:28 【问题描述】:

我正在使用 open cv ,我在从视频中捕获图像时遇到了问题。 我的基本需求是,当视频在 open cv 中运行时,只要我单击鼠标程序的右键应该从视频中捕获图像,然后图像应该保存在任何位置。在保存的图像之后,我必须执行进一步的图像处理。 请任何人帮助我。

【问题讨论】:

OpenCV 支持鼠标回调。对于视频,它是逐帧读取的,因此,创建一个存储当前帧的全局变量,您就可以开始了。 【参考方案1】:

这很简单。您需要鼠标回调、写入图像和运行剪辑,因此这是我为您提出问题的代码。

#include <iostream>
#include <string>
#include <sstream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>



cv::Mat currentFrame;

 static void onMouse( int event, int x, int y, int, void* )
 
    static int count(0);
    if ( event == cv::EVENT_RBUTTONDOWN ) 

      std::stringstream ss;
      ss << count;
      std::string countStr = ss.str();
      std::string imageName = "image_" + countStr;
      std::string FullPath = "/home/xxxx/" + imageName + ".jpg";
      cv::imwrite( FullPath, currentFrame );
      std::cout << " image has been saved " << std::endl;
      ++count;
   
 

int main()


    std::string clipFullPath = "/home/xxxx/drop.avi";
    cv::VideoCapture clip(clipFullPath);      

    if ( !clip.isOpened() )
        std::cout  << "Error: Could not open the  video: " << std::endl;
        return -1;
    


    cv::namedWindow("Display", CV_WINDOW_AUTOSIZE);
    cv::setMouseCallback("Display", onMouse, 0 );

    for(;;)

       clip >> currentFrame;  

        if ( currentFrame.empty() ) 
              break;        

        cv::imshow("Display", currentFrame);
        cv::waitKey(30);

    
    return 0;

std::to_string() 需要 -std=c++11。如果您想通过 GUI 窗口保存图像,我认为您需要另一个库,例如支持此功能的 Qt。

$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $$$$$$$$$$$$$$$$$$$$$$$$

已编辑:OP 需要从网络摄像头而不是视频中捕获帧。

这是评论中您问题的代码。

#include <iostream>
#include <cstdlib>
#include <string>
#include <sstream>
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"


cv::Mat frame;

 static void onMouse( int event, int x, int y, int, void* )
 
    static int count(0);
    if ( event == cv::EVENT_RBUTTONDOWN ) 

      std::stringstream ss;
      ss << count;
      std::string countStr = ss.str();
      std::string imageName = "image_" + countStr;
      std::string FullPath = imageName + ".jpg"; // save to the current directory
      cv::imwrite( FullPath, frame );
      std::cout << " image has been saved " << std::endl;
      ++count;
   



int main()

    // access the default webcam 
    cv::VideoCapture cap(0); 

    // Double check the webcam before start reading. 
    if ( !cap.isOpened() ) 
        std::cerr  << "Cannot open the webcam " << std::endl;
        exit (EXIT_FAILURE);
    

    cv::namedWindow("webcam",CV_WINDOW_AUTOSIZE);
    cv::setMouseCallback("webcam", onMouse, 0 );

    while ( true )

       // acquire frame 
       cap >> frame;

       // Safety checking 
       if ( !frame.data ) 
         std::cerr << "Cannot acquire frame from the webcam " << std::endl;
            break;
       

       cv::imshow("webcam", frame); 

       if ( cv::waitKey(30) == 27)
        std::cout << "esc key is pressed" << std::endl;
        break; 
       
    

    return 0;
 

图像保存在可执行文件的目录中。在终端命令中(即我使用的是 Mac 和 OpenCV 2.4.11)

g++ main.cpp -o main -I/opt/local/include -L/opt/local/lib -lopencv_highgui.2.4.11 -lopencv_core.2.4.11 

【讨论】:

此代码给出错误。 to_string ,错误多个重载函数“to string”实例与参数列表匹配:@CroCo 我应该如何为 std::to_string @CroCo 获取 std=c++11 @ShaikIbrahim,您使用的是哪个操作系统?在 Linux 中,g++ -std=c++11 提供有关您的代码(操作系统、编译器等)的更多信息 您可以使用cv::format("/some/path/%d.png", number);轻松避免字符串问题

以上是关于在打开的cv c ++中单击鼠标右键时如何从视频中捕获图像的主要内容,如果未能解决你的问题,请参考以下文章

如何截取视频的第一帧图片

用360极速浏览器如何从网上下载视频

笔记本电脑的摄像头在哪里打开 笔记本电脑摄像头如何打开

如何清理VMware虚拟机占用的硬盘空间

cmd的默认路径

使用 python 在打开的 cv 中使用鼠标事件绘制矩形或线条