如何使用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】:

您可以使用特征检测对相似图像进行分组。如果你从frame1frame2 得到足够的matches,它们应该是相似的。

【讨论】:

感谢大卫的回答。你能发送特征检测代码吗?我用谷歌搜索了它,但找不到答案。 OpenCV 网站教程:docs.opencv.org/doc/tutorials/features2d/feature_flann_matcher/… 你好 davidgsola 我尝试使用 flann 进行特征匹配。它给了我相似帧的好结果,但是当我比较不同的帧时,它给了我更多的匹配。这是我得到的输出 1. 对于帧 203 和 245,我得到了 45 个匹配,它们是相似的帧 2. 对于帧 204 和 2045我得到了 213 场比赛,它们是不同的帧。基于这个结果,它不能对相似的帧进行分组。你能帮我找到解决办法吗

以上是关于如何使用opencv比较存储在文件中的两个图像的主要内容,如果未能解决你的问题,请参考以下文章

在opencv中,图像是以啥数据类型存储的

如何使用 mingw64 gcc/g++ 比较两个图像?

如何在 QTableView 上存储图像(Qt 和 openCV)

OpenCV图像的轮廓的匹配

如何在 OpenCV 中检查两个图像是不是几乎相同?

使用 openCV 在 C++ 中查看灰度 RAW 图像文件