0

내쪽에는 Pleora의 EBUS SDK를 사용하여 카메라의 프레임을 읽으려면 C++을 사용하고 있습니다. 버퍼를 이미지로 변환하기 전에이 스트림을 처음 수신 할 때 각 픽셀에 대해 몇 가지 계산을 수행하기 위해 한 번에 16 비트 스트림을 읽을 수 있습니다. 즉, 각 픽셀에 대해 16 비트 덩어리의 데이터가 있습니다. .이미지를 바이너리 스트림으로 변환

이제 두 번째 절반은 장고 웹 앱으로 ffmpeg, nginx, hls 스트림을 통해이 비디오 출력을 제공합니다. 사용자가 비디오를 클릭하면 현재 프레임과 클릭 좌표를 가져 와서 C++ 부분에서 위와 같은 계산을 수행 할 수 있기를 원합니다.

지금 당장 프레임을 캡처하기 위해 html5 캔버스를 사용하고 프레임을 base64 인코딩 이미지로 변환하기 위해 canvas.toDataURL()을 사용합니다. 다음을 통해 base64 이미지, 좌표 및 프레임 크기를 파이썬으로 전달합니다. AJAX.

파이썬에서 픽셀 당 16 비트를 얻는 방법으로이 base64 인코딩 된 이미지를 조작하려고합니다. 순간 나는 다음을 수행하십시오 b64decoded_frame는 다음 이미지의 픽셀이 있으며 정수 값이 예상만큼 높지 않다에서

pos = json.loads(request.GET['pos']) 
str_frame = json.loads(request.GET['frame']) 
dimensions = json.loads(request.GET['dimensions']) 

pixel_index = (dimensions['width'] * pos['y']) + pos['x'] + 1 

b64decoded_frame = base64.b64decode(str_frame.encode('utf-8')) 

그러나, 훨씬 적은 인덱스가 있습니다. 확인한 후 png로 저장할 수 있으므로 이미지가 손상되지 않습니다.

요약하면, 각 픽셀을 16 비트로 나타내는 직렬화 된 이진 스트림으로 base64 이미지를 변환하려면 어떻게해야합니까?

UPDATE

은 내가

그리고 좀 더 연구 후에 내가 할 노력하고있어 그것의 mono16 값을 얻을 생각 python3.2

를 사용하고 있음을 언급하는 것을 잊었다 지정된 픽셀. 나는 그것이 내가 원하는 것인지는 확실하지 않다. 그러나 누구라도 이미지를 모노 16이나 픽셀 16으로 변환하는 방법을 설명 할 수 있다면 그것을 탐색 할 수 있었고 그것이 사실 해결책인지 알 수 있었다.

+0

왜 'b64decode'전에 'utf-8'로 인코딩합니까? – goncalopp

+0

아, 미안하지만, python3을 사용하고 있다는 것을 잊어 버렸습니다. 그렇게하지 않으면 "예상 바이트가 아닌 str"이라는 유형 오류가 발생합니다. utf-8로 인코딩하면 바이트 객체임을 보장합니다. – Rick

답변

0

내가 선택한 솔루션은 이미지를 8 비트 그레이 스케일 이미지로 변환 한 다음 원하는 픽셀을 16 비트 이미지로 변환하는 것입니다. 해결책은 다음과 같습니다 :

import base64 
import io 
from PIL import Image 

if request.method == 'GET': 
    if request.GET['pos'] and request.GET['frame']: 
     pos = json.loads(request.GET['pos']) 
     str_frame = json.loads(request.GET['frame']) 

     # Converts the base64 string into a byte string, we need to encode 
     # str_frame as utf-8 first otherwise python3.2 complains about unicode 
     b64decoded_frame = base64.b64decode(str_frame.encode('utf-8')) 

     # This puts the decoded image into a buffer so that I don't need to save 
     # it to disk to use it in PIL 
     byte_stream = io.BytesIO(b64decoded_frame) 

     # Open the image and convert it to 8-bit greyscale (mono8) 
     img = Image.open(byte_stream).convert('L') 

     # Get the 8-bit pixel value 
     pixel_val = img.getpixel((pos['x'], pos['y'])) 

     # Convert the 8-bit pixel value to 16-bit by holding the rations 
     # i.e. n8/(2^8 - 1) == x16/(2^16 - 1) 
     pixel_val = int(pixel_val/255 * 65535) 
관련 문제