본문 바로가기
opencv

(opencv) pixel access time

by 꼰대코더 2023. 8. 9.

샘플 Mat : 5000 x 3000 BGR Color All Black

    cv::Mat image = cv::Mat::zeros(cv::Size(5000, 3000),CV_8UC3);

RGB 의 합을 계산

 

방법 1) at(y좌표, x좌표)

int sum = 0;

for (int i = 0; i < image.rows; i++) {
   for (int j = 0; j < image.cols; j++) {
   		cv::Vec3b pixel = image.at<cv::Vec3b>(i, j);
		sum += pixel[2] + pixel[1] + pixel[0];
   }
}

방법 2) 선두 메모리 포인터 사용

int sum = 0;

for (int i = 0; i < image.rows; i++) {
   const cv::Vec3b* ptr = image.ptr<cv::Vec3b>(i);
   for (int j = 0; j < image.cols; j++)
		sum += ptr[j][2] + ptr[j][1] + ptr[j][0];
}

방법 3) 넓이 메모리가 width와 같을 경우(넓이가 8의 배수)

int sum = 0;

int width = image.cols;
int height = image.rows;

if (image.isContinuous()) {
    width *= height;
    height = 1;
}

for (int i = 0; i < height; i++) {
    const cv::Vec3b* ptr = image.ptr<cv::Vec3b>(i);
    for (int j = 0; j < width; j++)
        sum += ptr[j][2] + ptr[j][1] + ptr[j][0];
}

방법 4) iterator 를 이용

int sum = 0;

cv::MatConstIterator_<cv::Vec3b> it = image.begin<cv::Vec3b>(), it_end = image.end<cv::Vec3b>();
    
for (; it != it_end; ++it) {
    cv::Vec3b pixel = ((cv::Vec3b)*it);
    sum += pixel[2] + pixel[1] + pixel[0];
}

 

실행시간 비교 (본인 PC기준)

단위 : nanosec
1 sec=1 000 milisec=1 000 000 microsec=1 000 000 000 nanosec

방법 1차 2차 3차
1 100 0 0
2 100 0 0
3 0 0 100
4 10771700 9528100 9226600

 

 참조) https://kezunlin.me/post/61d55ab4/

 

speed up opencv image mat for loop | C++ Python. Computer Vision Deep Learning | KeZunLin's Blog

Publish Date:   2018-08-23 Word Count:   1,449 Read Times:   9 Min Read Count:  

kezunlin.me

 

결론)
아주 빅 사이즈의 이미지라면 액세스의 방법에 따라 시간차가 나겠지만 왠만한 사이즈는 무시할 정도의 시간이다.

'opencv' 카테고리의 다른 글

스캔문서의 기울기 알아보기  (0) 2023.11.26
(opencv) 이미지 저장형태, 액서스  (1) 2023.11.25
(opencv) Rectangle 간의 조작에 관해  (1) 2023.11.23
(opencv) Mat 의 기초  (0) 2023.08.05
(opencv) 환경설정  (0) 2023.08.05