by Seoyoung Kim

Categories

Tags

crop한 데이터를 비트맵으로 가져다 넣으니 이상한 결과를 얻게 되었다. 이미지의 데이터를 확인해 보다가 step size가 변하지 않는다는 것을 알았다. 그 이유를 찾다가 어떤 블로그를 찾게 되었고, 여기에 기반해 실험해보기로 했다. 블로그에는 resize로 되어있는데 crop을 의미하는 것 같다. 하지만 혹시 모르니 resize에 대해서도 실험해보았다. 저 블로그에서는

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

using namespace std;

int main(){
    cv::Mat img = cv::imread("/Users/kimseoyeong/Downloads/example.jpg");

    cout << "original col size: " << img.cols << endl;
    cout << "original row size: " << img.rows << endl;
    cout << "original step size: " << img.step[0] << endl;
    cout << endl;

    cv::Mat cropped = img(cv::Rect(1000,500,500,600));

    cout << "cropped col size: " << cropped.cols << endl;
    cout << "cropped row size: " << cropped.rows << endl;
    cout << "cropped step size: " << cropped.step[0] << endl;
    cout << endl;

    cv::Mat resized;
    cv::resize(img, resized, cv::Size(0, 0), 0.5, 0.5, cv::INTER_LINEAR);

    cout << "resized col size: " << resized.cols << endl;
    cout << "resized row size: " << resized.rows << endl;
    cout << "resized step size: " << resized.step[0] << endl;
    cout << endl;

    cv::Mat crop_resized;
    cv::resize(cropped, crop_resized, cv::Size(0, 0), 0.5, 0.5, cv::INTER_LINEAR);

    cout << "crop_resized col size: " << crop_resized.cols << endl;
    cout << "crop_resized row size: " << crop_resized.rows << endl;
    cout << "crop_resized step size: " << crop_resized.step[0] << endl;
    cout << endl;

    cv::imshow("wow", crop_resized);
    cv::waitKey(0);

    return 0;
}

실행 결과는 아래와 같다. crop된 경우에 step size가 동일함을 확인할 수 있다. resize의 경우에는 step size까지 같이 변화하며, crop된 이미지를 resize하게 되면 원래 이미지로 opencv로 이미지를 crop하면 step size가 원본 이미지와 같게 유지된다. 따라서 포인터로 데이터에 접근해서 수정하거나, crop한 이미지를 resize를 하거나 하게 되면 결과가 이상하게 나오게 된다.

original col size: 2500
original row size: 1406
original step size: 7500

cropped col size: 500
cropped row size: 600
cropped step size: 7500

resized col size: 1250
resized row size: 703
resized step size: 3750

crop_resized col size: 250
crop_resized row size: 300
crop_resized step size: 750

이를 해결하기 위해서는 clone을 통해 복사하거나(copyTo는 안된다.) crop의 경우는 memcpy를 통해서 crop된 부분만 다른 Mat에 할당하여 사용하면 된다.

이미지를 복사하는 여러 방법이 있다.

아직까지 의문인 부분은 imshow를 통해서 이미지를 띄울 때는 왜 이미지가 잘린 부분만 나오는지 crop이 된 나머지 부분을 어떻게 표시하고 있어 그 경계를 알 수 있는지에 대한 부분이다.