如何使用opencv比较存储在文件中的两个图像
Posted
技术标签:
【中文标题】如何使用opencv比较存储在文件中的两个图像【英文标题】:how to compare two images stored in a file using opencv 【发布时间】:2014-12-02 11:52:38 【问题描述】:我的硬盘包含从 2 分钟视频中提取的 3380 帧。
我想对相似的帧进行分组,并从每组中取一/两帧作为代表整个帧组的组的标题。
我也尝试过直方图比较,但 直方图 仅提供图形表示,
我正在整理视频
这是我的代码:
#include <stdio.h>
#include <iostream>
#include <conio.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
int main(int argc, char** argv)
// Read a video file from file
CvCapture* capture = cvCaptureFromAVI("C:\\Users\\Pavilion\\Documents\\Visual Studio 2013\\Projects\\video\\optical illusions.avi");
int loop = 0;
IplImage* frame = NULL;
Mat matframe;
Mat img_hsv, img_rgb;
char fname[20];
do
// capture frames from video
frame = cvQueryFrame(capture);
matframe = cv::cvarrToMat(frame);
// create a window to show frames
cvNamedWindow("video_frame", CV_WINDOW_AUTOSIZE);
// Display images in a window
cvShowImage("video_frame", frame);
sprintf(fname, "C:\\Users\\Pavilion\\Documents\\Visual Studio 2013\\Projects\\video\\video\\frames\\frame%d.jpg", loop);
// write images to a folder
imwrite(fname, matframe);
// Convert RGB to HSV
cvtColor(img_rgb, img_hsv, CV_RGB2HSV);
loop++;
cvWaitKey(10);
while (frame != NULL);
return 0;
/*
// read and process frames from file
char name[50];
int i = 0;
Mat output_image;
while (1)
sprintf(name, "frame%d.jpg", i);
//Load the image
Mat input_image = imread(name, 1);
if (!input_image.data) break;
//Image RGB to Grayscale
cvtColor(input_image, output_image, CV_RGB2GRAY);
//Applying Gaussian
GaussianBlur(output_image, output_image, Size(21.0, 21.0), 50.0);
//applying adaptive threshold
adaptiveThreshold(output_image, output_image, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY_INV, 111, -20);
sprintf(name, "frame%d-bin.jpg", i);
//save the image
imwrite(name, output_image);
i++;
*/
有人可以帮我吗,我是opencv的新手。
【问题讨论】:
【参考方案1】:您可以使用特征检测对相似图像进行分组。如果你从frame1
和frame2
得到足够的matches
,它们应该是相似的。
【讨论】:
感谢大卫的回答。你能发送特征检测代码吗?我用谷歌搜索了它,但找不到答案。 OpenCV 网站教程:docs.opencv.org/doc/tutorials/features2d/feature_flann_matcher/… 你好 davidgsola 我尝试使用 flann 进行特征匹配。它给了我相似帧的好结果,但是当我比较不同的帧时,它给了我更多的匹配。这是我得到的输出 1. 对于帧 203 和 245,我得到了 45 个匹配,它们是相似的帧 2. 对于帧 204 和 2045我得到了 213 场比赛,它们是不同的帧。基于这个结果,它不能对相似的帧进行分组。你能帮我找到解决办法吗以上是关于如何使用opencv比较存储在文件中的两个图像的主要内容,如果未能解决你的问题,请参考以下文章