2017년 8월 5일 토요일

opencv 픽셀 접근방법 시간 비교(픽셀 포인터 : at VS 행 단위 포인터 접근 : ptr)

픽셀 포인터 : at
행 단위 포인터 접근 : ptr 차이를 알아보기 위해 입력이미지에 상관없이 평균 밝기를 128로 만들어 주는 코드로 속도차이를 비교해 보았다.

lenne.bmp(512*512, gray color) 파일로 실험해보면
행단위 포인터 접근 방법이 더 빠르다.

release mode


debug mode : 시간 측정시 전혀 고려대상이 아님...


#include "opencv2/core/ocl.hpp"
main 문 안에 추가
cv::ocl::setUseOpenCL(false);

#pragma warning(disable: 4819)

#include "opencv2/opencv.hpp"
#include <iostream>

using namespace cv;
using namespace std;

int main(void)
{
    int pixel_count = 0;
    double image_luminous_sum = 0;
    double output_image_luminous_sum = 0;
    int64 t1, t2, t3,t4,t5,t6;
    Mat src = imread("lenna.bmp", IMREAD_GRAYSCALE);
    if (src.empty()) {
        cerr << "Image load failed!" << endl;
        return -1;
    }
    pixel_count = (src.rows)*(src.cols);
    cout << "input image pixel : " << pixel_count << "\n" << endl;
    /////////////////////////////////////////////////////////////////////////////
    
    t1 = getTickCount();
    for (int i = 0; i < src.rows; i++) {
        for (int j = 0; j < src.cols; j++) {
            image_luminous_sum = src.at<uchar>(i, j) + image_luminous_sum;
        }
    }
    Mat dst = src*128*pixel_count/image_luminous_sum;
    for (int i = 0; i < src.rows; i++) {
        for (int j = 0; j < src.cols; j++) {
            output_image_luminous_sum = dst.at<uchar>(i, j)+ output_image_luminous_sum;
        }
    }
    t3 = getTickCount();
    double ms1 = (t3 - t1) * 1000 / getTickFrequency();

    cout << "image_luminous_sum : " << image_luminous_sum << "\n" << endl;
    cout << "image_luminous_mean : " << (output_image_luminous_sum / pixel_count) << "\n" << endl;
    cout << "픽셀 포인터 연산 시간 : " << ms1 <<" ms "<<"\n" << endl;
    
    /////////////////////////////////////////////
    
    image_luminous_sum = 0;
    output_image_luminous_sum = 0;
    t4 = getTickCount();
    for (int i = 0; i < src.rows; i++) {
        uchar* p = src.ptr<uchar>(i);
        for (int j = 0; j < src.cols; j++) {
            image_luminous_sum = p[j] + image_luminous_sum;
        }
    }
    Mat dst2 = src * 128 * pixel_count / image_luminous_sum;
    for (int i = 0; i < src.rows; i++) {
        uchar* p2 = dst2.ptr<uchar>(i);
        for (int j = 0; j < src.cols; j++) {
            output_image_luminous_sum = p2[j] + output_image_luminous_sum;
        }
    }
    t6 = getTickCount();
    double ms4 = (t6 - t4) * 1000 / getTickFrequency();
    cout << "image_luminous_sum : " << image_luminous_sum << "\n" << endl;
    cout << "image_luminous_mean : " << (output_image_luminous_sum / pixel_count) << "\n" << endl;
    cout << "행 단위 포인터 접근방법 연산 시간: " << ms4 << " ms "<< "\n" << endl;
    imshow("src", src);
    imshow("dst", dst);
    imshow("dst2", dst2);
    waitKey(0);
    return 0;
}

댓글 없음:

댓글 쓰기