Closed kimpro82 closed 1 year ago
C++로 위와 같은 프로그램을 만들기 위해서는 이미지 처리를 위한 라이브러리가 필요합니다. 대표적인 이미지 처리 라이브러리로는 OpenCV가 있습니다.
아래는 OpenCV 라이브러리를 사용하여 이미지의 일정 부분을 설정된 좌표에 따라 자르는 C++ 코드입니다.
#include <opencv2/opencv.hpp>
int main(int argc, char** argv)
{
cv::Mat image = cv::imread("image.jpg");
// 설정된 좌표
int x = 100;
int y = 100;
int width = 200;
int height = 200;
// 이미지 일부 자르기
cv::Mat roi = image(cv::Rect(x, y, width, height));
// 자른 이미지 파일로 저장
cv::imwrite("roi.jpg", roi);
return 0;
}
위 코드에서 cv::Mat
은 OpenCV에서 이미지를 처리하기 위한 클래스이며, cv::imread
함수로 이미지를 읽어들이고, cv::Rect
로 설정된 좌표를 기반으로 이미지를 자릅니다. cv::imwrite
함수로 자른 이미지를 파일로 저장할 수 있습니다.
윈도우 환경에서는 드래그 앤 드롭을 이용하여 복수의 파일을 한번에 선택할 수 있습니다. 이를 활용하여 여러 이미지 파일들을 선택하면, 선택된 모든 파일들의 경로를 리스트로 받아올 수 있습니다. 그리고 해당 리스트를 for문을 이용하여 이미지 파일들을 순차적으로 처리하면 됩니다.
아래는 윈도우에서 드래그 앤 드롭을 통해 이미지 파일을 선택하는 코드 예시입니다.
import sys
if __name__ == '__main__':
# 드롭한 파일 경로 리스트 받아오기
file_list = sys.argv[1:]
# 파일 경로 리스트 출력
for file_path in file_list:
print(file_path)
위 코드를 실행한 후, 이미지 파일들을 드래그 앤 드롭하여 프로그램에 끌어다 놓으면 해당 이미지 파일들의 경로가 출력됩니다. 이후, 해당 경로를 이용하여 이미지 파일들을 처리하면 됩니다.
JSON 파일 안에 두 개 이상의 딕셔너리를 저장하는 것은 가능합니다. 다만, 이 경우에는 모든 딕셔너리를 하나의 리스트나 딕셔너리 안에 포함시켜야 합니다. 예를 들어, 다음과 같이 하나의 리스트 안에 두 개의 딕셔너리를 저장할 수 있습니다.
[ {"name": "Alice", "age": 25}, {"name": "Bob", "age": 30}]
이러한 방식으로 JSON 파일 안에 저장된 딕셔너리를 파이썬에서 읽어올 때에도, json.load()
함수를 사용하여 하나의 리스트 또는 딕셔너리로 읽어올 수 있습니다.
특정 폴더의 이미지 파일 리스트를 받아오기 위해서는 os
모듈을 사용할 수 있습니다. os
모듈의 listdir()
함수를 사용하여 특정 폴더의 파일 리스트를 받아올 수 있습니다. 이때, 파일의 확장자가 이미지 파일인지를 확인하기 위해 os.path
모듈의 splitext()
함수를 사용하여 파일 확장자를 추출하고, 그 확장자가 이미지 파일인지를 확인합니다.
다음은 .jpg
, .jpeg
, .png
, .bmp
확장자를 가진 이미지 파일들만을 리스트로 받아오는 예제 코드입니다.
import os
def get_image_files(path):
image_extensions = ['.jpg', '.jpeg', '.png', '.bmp']
image_files = []
for file_name in os.listdir(path):
ext = os.path.splitext(file_name)[-1].lower()
if ext in image_extensions:
image_files.append(os.path.join(path, file_name))
return image_files
이 함수를 실행하면 해당 폴더 내에 있는 모든 이미지 파일의 리스트가 반환됩니다. 사용 예시는 다음과 같습니다.
image_files = get_image_files('/path/to/image/folder')
print(image_files)
위 코드에서 /path/to/image/folder
는 대상 폴더의 경로로 바꿔주시면 됩니다.
다음과 같은 코드를 사용하여 마지막 _
이후의 문자열을 추출할 수 있습니다.
filename = "example_file_l2.jpg"
underscore_index = filename.rfind("_")
result = filename[underscore_index+1:]
위 코드를 실행하면 result
변수에는 "l2.jpg"라는 문자열이 저장됩니다. rfind()
함수는 문자열의 끝에서부터 해당 문자열을 찾아서 가장 먼저 발견되는 위치의 인덱스를 반환합니다. 따라서 위 코드에서는 마지막 _
의 위치를 찾아서 그 이후의 문자열을 추출하게 됩니다.
+ rfind()
메서드가 -1
을 반환하는 경우는 해당 문자열이 발견되지 않은 경우이며, 이 경우 filename[underscore_index+1:]
는 filename
의 끝에서부터 _
문자열을 찾지 못했으므로 null
대신 filename
전체 문자열을 반환할 것입니다. 이에 대해 적절한 예외 처리를 해주는 것이 좋습니다.
+ _
가 없는 파일명에서는 underscoreindex가 -1이 되므로, 조건문으로 ``가 있는 파일명에서만 처리하도록 할 수 있습니다. 아래는 예시 코드입니다.
filename = 'example_filename.jpg'
underscore_index = filename.rfind('_')
if underscore_index > 0:
suffix = filename[underscore_index+1:]
print(suffix)
else:
print("Underscore not found in filename.")
위 코드에서는 _
가 없는 파일명에서는 "Underscore not found in filename."이 출력됩니다.
경로를 제외한 파일명만 얻으려면 os.path.basename()
함수를 사용하면 됩니다. 예를 들어 C:/Users/Documents/example.txt
경로에서 파일명 example.txt
만 추출하려면 다음과 같이 작성할 수 있습니다.
import os
path = 'C:/Users/Documents/example.txt'
filename = os.path.basename(path)
print(filename) # 출력: example.txt
이와 같이 os.path.basename()
함수는 파일 경로에서 파일명을 추출해줍니다.
from ChatGPT
이미지를 처리하기 위해서는 Python Imaging Library (PIL) 을 사용할 수 있습니다. PIL은 이미지 파일을 열고, 저장하고, 크기를 조정하고, 필터링하고, 작업하고, 이미지 데이터를 가져오고, 색상 공간을 변환하고, 히스토그램을 분석하고, 이미지를 다른 형식으로 변환하고, 기타 많은 작업을 수행할 수 있는 강력한 라이브러리입니다.
아래는 PIL 라이브러리를 사용하여 이미지의 일부분을 자르는 예제입니다. 해당 좌표를 입력하면 해당 좌표로부터 일정 크기의 이미지를 잘라낼 수 있습니다.
위 코드에서
image.jpg
는 원본 이미지 파일 경로입니다.left
,top
,right
,bottom
은 각각 자를 부분의 좌상단과 우하단 좌표를 나타냅니다.crop()
메소드를 사용하여 해당 좌표로부터 일정 크기의 이미지를 자릅니다. 마지막으로,save()
메소드를 사용하여 자른 이미지를 새로운 파일로 저장합니다.