【OpenCV】视频输入与相似度测量

视频输入

  与之前的博客内容不同,本节处理的是视频流而非图像集。视频流来源可以是摄像头的实时图像反馈、已拍摄存储的视频。OpenCV可以读取这两种类型的视频流并采用RSNP和SSIM检查图像的相似度,使用函数为 cv::VideoCapture 。

  本节的测试视频下载地址:
https://github.com/opencv/opencv/blob/master/samples/data/Megamind.avi
https://github.com/opencv/opencv/blob/master/samples/data/Megamind_bugy.avi

  参考链接:https://docs.opencv.org/master/d5/dc4/tutorial_video_input_psnr_ssim.html


相似度测量

  视频的转换操作是难以察觉的,因此通过帧与帧间的差异来测量相似度。

  常用的方法是峰值信噪比PSNR(Peak signal-to-noise ratio),记I1、I2是输入的两幅图像,i,j是二维图像的大小,c是通道数量。


  SSIM方法在代码中可以推出,由于使用了多次高斯平滑,其开销较大。运行结果相同时,SSIM用时会比PSNR多得多。PSNR可以为每一帧执行相似度测量,而SSIM仅被用于测量PSNR低于输入值的帧。


代码示例

#include <iostream>
#include <string>
#include <iomanip>                  // 控制浮动类型的打印精度
#include <sstream>                  // 字符串和数值的转换

#include <opencv2/core.hpp>         // CV::Mat,Scalar
#include <opencv2/imgproc.hpp>      // 高斯平滑
#include <opencv2/videoio.hpp>      // 视频
#include <opencv2/highgui.hpp>      

using namespace std;
using namespace cv;

double getPSNR(const Mat& I1, const Mat& I2);
Scalar getMSSIM(const Mat& I1, const Mat& I2);

int main(int argc,char *argv[])
{
    const 
  • 0
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV 是一个开源的计算机视觉库,包含了大量的图像处理和计算机视觉算法。两幅图像的相似度可以通过特征匹配来实现。常用的方法是使用 SIFT 特征描述子来提取关键点和特征向量,然后使用 FLANN 或者暴力匹配算法进行匹配,最后通过计算匹配对之间的距离和数量来确定两幅图像的相似度。 以下是使用 OpenCV 在 C++ 中实现两幅图像匹配相似度的示例代码: ``` #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main(int argc, char** argv) { // 读入两幅图像 Mat img1 = imread("img1.jpg", IMREAD_GRAYSCALE); Mat img2 = imread("img2.jpg", IMREAD_GRAYSCALE); // 使用 SIFT 特征描述子提取关键点和特征向量 Ptr<Feature2D> f2d = xfeatures2d::SIFT::create(); vector<KeyPoint> keypoints1, keypoints2; Mat descriptors1, descriptors2; f2d->detectAndCompute(img1, noArray(), keypoints1, descriptors1); f2d->detectAndCompute(img2, noArray(), keypoints2, descriptors2); // 使用 FLANN 匹配器进行匹配 FlannBasedMatcher matcher; vector<DMatch> matches; matcher.match(descriptors1, descriptors2, matches); // 计算匹配点对之间的距离 double max_dist = 0; double min_dist = 100; for(int i = 0; i < descriptors1.rows; i++) { double dist = matches[i].distance; if(dist < min_dist) min_dist = dist; if(dist > max_dist) max_dist = dist; } // 筛选出较好的匹配点对 vector<DMatch> good_matches; for(int i = 0; i < descriptors1.rows; i++) { if(matches[i].distance <= max(2 * min_dist, 0.02)) { good_matches.push_back(matches[i]); } } // 计算相似度并输出结果 double sim = (double)good_matches.size() / (double)matches.size(); cout << "相似度为: " << sim << endl; return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值