스택큐힙리스트

파이썬 OpenCV에서 배열로부터 원시 PNG를 읽는 방법은 무엇인가요? 본문

카테고리 없음

파이썬 OpenCV에서 배열로부터 원시 PNG를 읽는 방법은 무엇인가요?

스택큐힙리스트 2023. 11. 10. 07:36
반응형

나는 iPhone에서 MacBook으로 tcp를 통해 png 이미지를 스트리밍하고 있습니다. MacBook 코드는 http://docs.python.org/library/socketserver.html#requesthandler-objects에서 가져왔습니다. 이미지를 OpenCV와 함께 사용하기 위해 어떻게 변환할 수 있을까요? png는 효율적이기 때문에 선택되었지만 다른 형식을 사용할 수도 있습니다.


파일에서 rawImage를 읽는 테스트 프로그램을 작성했지만 변환하는 방법을 잘 모릅니다:


# Read rawImage from a file, but in reality will have it from TCPServer
f = open('frame.png', rb)
rawImage = f.read()
f.close()
# Not sure how to convert rawImage
npImage = np.array(rawImage)
matImage = cv2.imdecode(rawImage, 1)
#show it
cv.NamedWindow('display')
cv.MoveWindow('display', 10, 10)
cv.ShowImage('display', matImage)
cv. WaitKey(0)

답변 1

앤디 로젠프 럼의 작업이며, 오래된 cv python API (cv2 대비 cv)를 사용하는 경우 가장 좋은 솔루션 일 수 있습니다.


그러나 이 질문은 최신 버전의 사용자들에게도 동일하게 흥미로운 것이므로, 다음 솔루션을 제안합니다. 아래의 샘플 코드는 다음과 같이 기존 솔루션보다 더 좋을 수 있습니다:



  1. 최신 OpenCV python API (cv2 대비 cv)와 호환됩니다. 이 솔루션은 opencv 3.0과 python 3.0에서 테스트되었습니다. opencv 2.x와/또는 python 2.7.x의 경우는 단순한 수정이 필요할 것으로 믿습니다.

  2. 더 적은 imports. 이 작업은 numpy와 opencv를 직접 사용하여 수행할 수 있으며, StringIO와 PIL이 필요하지 않습니다.


다음은 파일 오브젝트에서 직접 디코딩된 opencv 이미지를 생성하는 방법 또는 파일 오브젝트에서 읽은 바이트 버퍼에서 생성하는 방법입니다.

import cv2
import numpy as np
# 파일에서 데이터 읽기
with open(somefile, 'rb') as infile:
buf = infile.read()
# numpy를 사용하여 바이트에서 배열 생성
x = np.fromstring(buf, dtype='uint8')
# 배열을 이미지로 디코드
img = cv2.imdecode(x, cv2.IMREAD_UNCHANGED)
# 이미지 보여주기
cv2.imshow(어떤 창, img)
cv2.waitKey(0)

opencv 3.0에서는 각 상수/플래그의 명명 규칙이 변경되었으므로 opencv 2.x를 사용할 경우 cv2.IMREAD_UNCHANGED 플래그를 변경해야합니다. 또한 이 코드 샘플은 표준 8비트 이미지를 로드한다고 가정하고 있지만, 그렇지 않은 경우 np.fromstring의 dtype='...' 플래그를 조정할 수 있습니다.

답변 2

아파치 오픈씨브이(OpenCV)는 이미지 및 비디오 처리를 위한 오픈 소스 라이브러리로, 파이썬 언어에서도 널리 사용되고 있습니다. 이번 에세이에서는 파이썬 오픈씨브이를 사용하여 배열로부터 원시 PNG 이미지를 읽는 방법에 대해 설명하려고 합니다.
파이썬에서 이미지를 처리하려면 오픈씨브이를 설치해야 합니다. 오픈씨브이를 설치하기 위해서는 아나콘다(Anaconda)와 같은 파이썬 패키지 관리자를 사용하거나, 패키지 설치 관리자(pip)를 통해 다음과 같이 설치할 수 있습니다.
```
pip install opencv-python
```
이제 오픈씨브이가 설치되었으므로, PNG 이미지를 읽기 위해 `imread` 함수를 사용할 수 있습니다. `imread` 함수는 이미지 경로를 입력으로 받아 이미지 파일을 읽어들입니다. 그러나 이번 예제에서는 이미지가 배열로 제공되는 상황에서 어떻게 읽을 수 있는지 알아보려고 합니다.
먼저, `numpy` 라이브러리를 사용하여 배열을 생성합니다. 이 배열에는 이미지 데이터가 들어가는데, 각 픽셀은 RGB 값으로 표현됩니다. 그 다음, `cv2.imdecode` 함수를 사용하여 PNG 배열을 이미지로 디코딩합니다.
```python
import numpy as np
import cv2
image_array = np.array([...] # 이미지 배열
decoded_image = cv2.imdecode(image_array, cv2.IMREAD_UNCHANGED)
```
위의 코드에서 `image_array`는 이미지 데이터가 들어있는 배열을 의미합니다. 배열의 내용과 형식에 따라 코드를 조정해야 합니다. `cv2.IMREAD_UNCHANGED` 플래그는 이미지를 원시 상태로 유지할 것임을 나타냅니다.
이제 `decoded_image`에는 원시 PNG 이미지가 이미지 형식으로 디코딩된 데이터가 담겨 있습니다. 필요에 따라 이 데이터를 처리하거나 표시할 수 있습니다.
이처럼 파이썬 오픈씨브이를 사용하면 배열로부터 직접 PNG 이미지를 읽어올 수 있습니다. 오픈씨브이의 강력한 기능을 활용하여 이미지 데이터를 처리하는 것은 다양한 분야에 응용될 수 있습니다. 오픈씨브이를 사용하여 이미지 처리 작업을 자동화하고 간소화할 수 있으므로, 이미지 처리 작업에 관심이 있는 사용자들에게 추천드립니다.
이렇게 파이썬 오픈씨브이를 활용하여 배열로부터 원시 PNG 이미지를 읽는 방법에 대해 설명했습니다. 오픈씨브이를 활용하여 이미지 처리 작업을 쉽고 효율적으로 수행할 수 있으니, 관심 있는 사용자들은 더 많은 학습과 실험을 통해 이 기술을 응용해 보시기 바랍니다.

반응형
Comments