zoukankan      html  css  js  c++  java
  • opencv 实现SAD匹配,和计时

    #include <opencv2/opencv.hpp>
    #include <opencv2/core/core.hpp>
    #include <opencv2/highgui/highgui.hpp>
    
    #include <iostream>
    #include <string>
    #include "windows.h"
    
    using namespace std;
    using namespace cv;
    
    const int w = 384;
    const int h = 288;
    const int maxDisparity = 40;
    const int RAD = 5;
    void cpu_stereo(uchar* Limg,
                              uchar* Rimg,
                              uchar* Oimg)
    {
        for( int y = 0 ; y< h; y++)
        {
            for(int x = 0 ; x< w; x++){
                unsigned int bestCost = 999999;
                unsigned int bestDisparity = 0;
                for( int  d = 0; d<= maxDisparity; d++)
                {
                    unsigned int cost = 0;
                    for( int i = -RAD; i<= RAD; i ++)
                    {
                        for( int j = -RAD; j<=RAD; j++)
                        {
                            int yy,xx,xxd;
                            yy = y + i;
                            if( yy < 0 ) yy = 0;
                            if (yy>=h) yy = h-1;
                            xx = x + j;
                            if( xx < 0) xx = 0;
                            if ( xx>=w) xx = w -1;
                            xxd = xx - d ;
                            if ( xxd < 0 ) xxd = 0;
                            if ( xxd >=w ) xxd  = w-1;
                            cost += abs((int)(Limg[yy*w + xx] - Rimg[yy*w + xxd]));
                        }
                    }
                    if(cost < bestCost)
                    {
                        bestCost = cost;
                        bestDisparity = 255  - d*6;
                    }
                    Oimg[y*w + x] = bestDisparity;
                }
            }
        }
    }
    
    int main()
    {
        Mat imL, imR,imO;
        imL = imread("data\imL.bmp",0);
        if ( imL.empty() )
        {
            cout<<"Could not find the imL."<< std::endl;
            return -1;
        }
        imR = imread("data\imR.bmp",0);
        if ( imR.empty() )
        {
            cout<<"Could not find the imR."<< std::endl;
            return -1;
        }
        imO.create(imL.rows,imL.cols,imL.type());
        // 创建、初始化CPU计时
        LARGE_INTEGER freq;  
        LARGE_INTEGER start_t, stop_t;  
        double exe_time;  
        QueryPerformanceFrequency(&freq);
        QueryPerformanceCounter(&start_t);
    
        cpu_stereo(imL.data,imR.data,imO.data);
    
        QueryPerformanceCounter(&stop_t);  
        exe_time = 1e3*(stop_t.QuadPart-start_t.QuadPart)/freq.QuadPart;  
        cout<<"CPU costs"<<exe_time<<"ms"<<endl;
    
        namedWindow("left",WINDOW_AUTOSIZE);
        namedWindow("right",WINDOW_AUTOSIZE);
        namedWindow("Output",WINDOW_AUTOSIZE);
        imshow("Output", imO);
        imshow("left", imL);
        imshow("right",imR);
        waitKey(0);
         return 0;
    }

    输出图像的初始化由函数create(imL.rows,imL.cols,imL.type())实现。

    cpu_stereo函数的接口是uchar*类型,调用时是imL.data。

    计时函数需要包含头文件"windows.h",实现计时的具体步骤为

    // 创建、初始化CPU计时
        LARGE_INTEGER freq;  
        LARGE_INTEGER start_t, stop_t;  
        double exe_time;  
        QueryPerformanceFrequency(&freq);
        QueryPerformanceCounter(&start_t);
    
        do some job
    QueryPerformanceCounter(
    &stop_t); exe_time = 1e3*(stop_t.QuadPart-start_t.QuadPart)/freq.QuadPart; cout<<"CPU costs"<<exe_time<<"ms"<<endl;
  • 相关阅读:
    vim中如何设置多行注释和删除注释
    ubuntu如何设置普通用户密码
    ubuntu中出现syntax error:Bad for loop variable
    学习进度条
    单元测试练习
    用户体验设计案例分析
    学生成绩录入系统设计与实现
    需求分析
    结对项目——词频统计2
    结对项目—— 词频统计
  • 原文地址:https://www.cnblogs.com/zi-wang/p/5368095.html
Copyright © 2011-2022 走看看