반응형
애니메이션 구현을 위해 다음과 같은 스프라이트 이미지를 여러장 구했다. 투명 처리를 위해 배경색을 변경해야 되는데 사진이 여러장이다 보니 하나하나 변경하기가 매우 귀찮았다. 좌우 반전도 마찬가지.
opencv 말만 들어봤지 사용은 안해봤었는데 이김에 한번 사용해보기로 했다. 여러개의 이미지를 읽어서 각 이미지에 대해 좌우반전 후에 배경색을 특정색(마젠타)으로 변경하길 원했다. 색 변경의 경우 각 이미지의 픽셀을 하나하나 확인하면서 조건문으로 배경색과 동일한 픽셀은 마젠타로 변경한다. 다행히 모든 사진의 배경색이 동일해서 수월했다.
코드도 간단하고 매우 쉬웠다.
한가지 특이했던 건 픽셀값을 RGB가 아닌 BGR 순서로 저장하는 듯 하다. 700개 정도의 파일을 처리하는데 디버그 모드로 4초 정도 걸린 듯 하다.
#pragma comment(lib, "opencv_world450d.lib")
#include <opencv2/core/core.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
#include <string>
#include <vector>
#include <ctime>
using namespace std;
using namespace cv;
#define FILE_NUM 783
#define MAKE_INPUT_FILE_NAME(n) ("Magaki_" + to_string(n) + ".png")
#define MAKE_OUTPUT_FILE_NAME(n) ("R_Magaki_" + to_string(n) + ".png")
struct RGB
{
uchar Red;
uchar Green;
uchar Blue;
};
// before 픽셀을 모두 after 픽셀로 변경
void ChangeSpecificPixels(Mat* pInImage, Mat* pOutImage, const RGB& before, const RGB& after)
{
for (int y = 0; y < pInImage->rows; ++y)
{
for (int x = 0; x < pInImage->cols; ++x)
{
if (pInImage->at<Vec3b>(y, x) == Vec3b(before.Blue, before.Green, before.Red))
{
pOutImage->at<Vec3b>(y, x)[0] = after.Blue;
pOutImage->at<Vec3b>(y, x)[1] = after.Green;
pOutImage->at<Vec3b>(y, x)[2] = after.Red;
}
}
}
}
int main()
{
clock_t start = clock();
const string INPUT_DIRECTORY = "image/";
vector<string> fileNames;
fileNames.reserve(FILE_NUM);
for (size_t i = 0; i < FILE_NUM; ++i)
{
fileNames.emplace_back(string(INPUT_DIRECTORY + MAKE_INPUT_FILE_NAME(i)));
}
// 기존 RGB(41, 99, 82)
// 원하는 RGB(255, 0, 255)
constexpr RGB before { 41, 99, 82 };
constexpr RGB after { 255, 0, 255 };
Mat src;
Mat dest;
const string OUTPUT_DIRECTROY = "output/";
for (size_t i = 0; i < FILE_NUM; ++i)
{
src = imread(fileNames[i]);
if (src.empty())
{
cerr << i << endl;
}
// 이미지 좌우 반전
flip(src, dest, 1);
// RGB(41,99,82) -> RGB(255, 0, 255)로 변경
ChangeSpecificPixels(&dest, &dest, before, after);
// dest 이미지를 output 파일로 생성
imwrite(OUTPUT_DIRECTROY + MAKE_OUTPUT_FILE_NAME(i), dest);
}
clock_t end = clock();
cout << end - start << "ms" << endl;
waitKey(0);
return 0;
}
결과
'게임 공부 > 게임 개발 일지' 카테고리의 다른 글
카메라(eye) 이동 및 회전 (0) | 2021.03.24 |
---|---|
애니메이션 테스트 (0) | 2020.12.21 |
적 총알 발사 기능 추가 (0) | 2020.12.13 |
다른 게임의 에셋 이미지 가져와서 적용하는데 성공! (0) | 2020.12.09 |
이미지 파일 컬러키 설정 꿀팁 (0) | 2020.12.05 |
댓글