【opencv3】视频透视变换C++

简介: 【opencv3】视频透视变换C++

实现目标


鼠标选中4个目标边界点,计算转换矩阵,对视频进行透视变换。


程序


#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include <iostream>  
using namespace cv;
using namespace std;
void onMouse(int event, int x, int y, int flags, void *utsc);
Point2f srcTri[4], dstTri[4];
int clickTimes = 0;//点击次数
Mat imageWarp;
Mat frame;
int main()
{
  VideoCapture video("H:\\test.mp4");
  if (!video.isOpened())
  return -1;
  video.set(CV_CAP_PROP_FRAME_WIDTH, 1280);
  video.set(CV_CAP_PROP_FRAME_HEIGHT, 720);
  while (1)
  {
  int frameCount = video.get(CV_CAP_PROP_FRAME_COUNT);//获取帧数  
  double FPS = video.get(CV_CAP_PROP_FPS);//获取FPS  
  for (int i = 0; i < frameCount; i++)
  {
    video.read(frame);
    if (frame.empty())//异常检测  
    {
    cout << "frame is empty!" << endl;
    break;
    }
    setMouseCallback("Source Image", onMouse);
    imshow("Source Image", frame);
  }
  }
  return 0;
}
void onMouse(int event, int x, int y, int flags, void *utsc)
{
  if (event == CV_EVENT_LBUTTONUP)//响应鼠标左键抬起事件
  {
  circle(frame, Point(x, y), 2.5, Scalar(0, 0, 255), 2.5);//标记选中点
  imshow("Source Image", frame);
  srcTri[clickTimes].x = x;
  srcTri[clickTimes].y = y;
  cout << "x: " << x << "  y: " << y << endl;
  clickTimes++;
  }
  if (clickTimes == 4)
  {
  //注意点的顺序:左上,右上,左下,右下
  dstTri[0].x = 0;
  dstTri[0].y = 0;
  dstTri[1].x = frame.rows - 1;
  dstTri[1].y = 0;
  dstTri[2].x = 0;
  dstTri[2].y = frame.cols - 161;
  dstTri[3].x = frame.rows - 1;
  dstTri[3].y = frame.cols - 161;
  Mat transform = Mat::zeros(3, 3, CV_32FC1);//透视变换矩阵
  transform = getPerspectiveTransform(srcTri, dstTri);//获取透视变换矩阵  
  warpPerspective(frame, imageWarp, transform, Size(frame.rows, frame.cols - 160));//透视变换
  imshow("After WarpPerspecttive", imageWarp);
  }
}


相关文章
|
1月前
|
计算机视觉
Opencv学习笔记(八):如何通过cv2读取视频和摄像头来进行人脸检测(jetson nano)
如何使用OpenCV库通过cv2模块读取视频和摄像头进行人脸检测,并提供了相应的代码示例。
84 1
|
5月前
|
算法 开发工具 计算机视觉
【零代码研发】OpenCV实验大师工作流引擎C++ SDK演示
【零代码研发】OpenCV实验大师工作流引擎C++ SDK演示
82 1
|
1月前
|
Ubuntu Linux 编译器
Linux/Ubuntu下使用VS Code配置C/C++项目环境调用OpenCV
通过以上步骤,您已经成功在Ubuntu系统下的VS Code中配置了C/C++项目环境,并能够调用OpenCV库进行开发。请确保每一步都按照您的系统实际情况进行适当调整。
281 3
|
1月前
|
编解码 关系型数据库 计算机视觉
Opencv学习笔记(十一):opencv通过mp4保存为H.264视频
本文介绍了如何在OpenCV中通过使用cisco开源的openh264库来解决不支持H.264编码的问题,并提供了完整的代码示例。
66 0
Opencv学习笔记(十一):opencv通过mp4保存为H.264视频
|
2月前
|
存储 计算机视觉 C++
在C++中实现Armadillo库与OpenCV库之间的数据格式转换
在C++中实现Armadillo库与OpenCV库之间的数据格式转换是一项常见且实用的技能。上述步骤提供了一种标准的方法来进行这种转换,可以帮助开发者在两个库之间高效地转移和处理数据。虽然转换过程相对直接,但开发者应留意数据类型匹配和性能优化等关键细节。
62 11
|
3月前
|
计算机视觉 索引
OpenCV读取视频失败<无可用信息,未为 opencv_world453.dll 加载任何符号> cv::VideoCapture
本文介绍了解决OpenCV读取视频失败的错误,指出问题通常由视频路径错误或摄像头索引错误导致,并提供了相应的解决方法。
OpenCV读取视频失败<无可用信息,未为 opencv_world453.dll 加载任何符号> cv::VideoCapture
|
2月前
|
存储 计算机视觉 C++
在C++中实现Armadillo库与OpenCV库之间的数据格式转换
在C++中实现Armadillo库与OpenCV库之间的数据格式转换是一项常见且实用的技能。上述步骤提供了一种标准的方法来进行这种转换,可以帮助开发者在两个库之间高效地转移和处理数据。虽然转换过程相对直接,但开发者应留意数据类型匹配和性能优化等关键细节。
25 3
|
5月前
|
计算机视觉
opencv之形态变换
opencv之形态变换
|
4月前
|
机器学习/深度学习 XML 计算机视觉
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。
|
5月前
|
计算机视觉
OpenCV加载视频
OpenCV加载视频