我是一個開放的cv工作,我面臨從視頻捕獲圖像的問題。 我的基本需求是,當視頻在打開的cv中運行時,只要單擊鼠標程序的右鍵應從視頻捕捉圖像,然後圖像應保存在任何位置。之後,在保存的圖像上,我必須執行進一步的圖像處理。 請任何人幫助我。如何從視頻捕獲圖像時,鼠標右鍵單擊打開cv c + +
回答
這很簡單。你需要鼠標回調,寫一個圖像,並運行一個剪輯,因此這是我的代碼爲您的問題。
#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=c++11
爲std::to_string()
。如果你想通過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 :: C++ 11如何獲得std :: to_string @CroCo –
@ShaikIbrahim,您正在使用哪種操作系統?在Linux中,'g ++ -std = C++ 11' – CroCo
- 1. 如何從ContextMenu打開模態(單擊鼠標右鍵)?
- 2. 谷歌地圖如何打開和關閉雙擊鼠標右鍵單擊V3
- 3. 允許單擊鼠標左鍵單擊鼠標右鍵或按Ctrl鍵單擊打開對話框
- 4. 想要鼠標右鍵單擊ToolStripMenuItem - C#
- 5. 如何捕獲右鍵單擊事件?
- 6. 如何從鼠標懸停圖像點擊開始YouTube視頻點擊?
- 7. 打開cv不捕獲視頻,直到設置斷點
- 8. 從圖像序列中創建一個視頻打開cv
- 9. 調用從鍵盤右鍵單擊鼠標右箭頭的keydown
- 10. 用鼠標右鍵單擊一個圖像,禁用其他圖像點擊
- 11. 如何從鼠標右鍵單擊文本?
- 12. 如何讓鼠標按住右鍵單擊C#
- 13. 禁用鼠標右鍵單擊圖像控件VB6
- 14. 鼠標右鍵單擊WindowsUI的DevExpress
- 15. Datagrid +鼠標右鍵單擊事件
- 16. 當我右鍵單擊鼠標不顯示在新標籤菜單中打開
- 17. 如何打開圖像/視頻/音頻?
- 18. 右鍵單擊鼠標事件錯誤
- 19. g_signal_connect用於單擊鼠標右鍵?
- 20. 用鼠標右鍵單擊NSStatusItem
- 21. Google地圖,如何捕獲POI上的右鍵單擊事件
- 22. 從Kinect視頻圖像獲取鼠標座標
- 23. 捕獲鼠標左鍵點擊
- 24. 右鍵單擊文本捕獲
- 25. 捕獲右鍵單擊事件
- 26. 捕獲右鍵單擊HTML DIV
- 27. 只能從「在新標籤中打開鏈接」右鍵單擊
- 28. 打開cv C++:如何分割視頻幾個部分?
- 29. clearInterval同時單擊鼠標左鍵和右鍵不起作用
- 30. 如何在Winforms中捕獲鼠標右鍵點擊粘貼功能
OpenCV支持鼠標回調。對於視頻,它是逐幀讀取的,因此,創建一個存儲當前幀的全局變量,然後您就可以開始了。 – CroCo