2016-07-20 9 views
1

C++을 사용하고 있으며 이미지 데이터의 배열이 void * 있습니다. 나는 그것이 RGB 픽셀 값의 배열이라는 것을 알았고 결과 이미지의 너비와 높이에 관한 정보를 가지고있다. 각 픽셀 값은 인터리빙 된 R, G 및 B 정수 (즉, 123456 = R : 12, G : 34, B : 56)의 정수입니다. 이 배열을 OpenCV Mat 이미지로 변환해야합니다. 나는이 온라인의 많은 예를 발견했지만 아무도 성공하지 못했다.C++ - RGB 1 차원 배열을 OpenCV 매트로 변환

cv::Mat image = cv::Mat(width*height*4, 1, CV_8U, (unsigned*)data); 
cv::Mat reshaped = image.reshape(0, height); 
cv::imwrite("Test.jpg", reshaped); 

위의 코드는 그레이 스케일, 내 컬러 이미지의 가늘고 긴 버전을 저장 : 여기에 나를 위해 작업에 가장 가까운왔다 코드의 축약 버전입니다. 나는 또한 시도했다 :

cv::Mat image = cv::Mat(width, height, CV_8U, (unsigned*)data); 
cv::imwrite("Test.jpg", image); 

위의 코드는 내 컬러 이미지의 잘게 잘린 회색 버전을 저장합니다. 내가 시도한 다른 것 (CV_16U, CV_32F, (byte *) 데이터 등)은 방금 검은 색 이미지를 반환했습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

또는 for 루프를 사용하지 않고 C++을 사용하여 배열에서 이미지를 저장하는 더 쉬운 방법을 찾을 수 없기 때문에 OpenCV 만 사용하고 있습니다. 나는 모든 픽셀을 반복하고 개별적으로 저장함으로써 PPM 이미지를 저장하는 데 성공했지만, 이제는 더 효율적인 것이 필요합니다. 배열에서 이미지를 저장하는 다른 방법이 있다면, 대신 그것을 사용하게되어 기쁩니다.

+0

'데이터'에 대한 설명은 다소 혼란 스럽습니다. 좀 더 명확히 할 수 있습니까? 각 채널 (단일 R)은 정수 (int)입니까? 또는 각각은 서명되지 않은 char이며, 함께 int (덧붙인 패딩을위한 unsigned char 한 개와 함께)를 만듭니다. – cxyzs7

답변

1

컬러 이미지를 얻으려면 CV_8U 유형으로 충분하지 않습니다. 이 유형은 단일 채널 8 비트 이미지를 나타냅니다. 데이터가 참으로 32 비트 정수 배열 인 경우 원하는 것은 CV_8UC4입니다.

cv::Mat image = cv::Mat(width, height, CV_8UC4, (unsigned*)data); 

네 번째 채널은 알파 값 (투명도)을 나타냅니다. 그것을 떨어 뜨리고 싶다면 OpenCV에게 이미지를 CV_8UC3으로 변환하도록 요청할 수 있습니다.

image = cv2.cvtColor(image, cv2.CV_BGRA2BGR) 

또한 OpenCV는 BGR 순서의 색상 값을 나타냅니다. 이미지를 만들 때 데이터가 BGR 형식인지 확인하십시오.

+0

정말 고마워요. 유형과 관련이 있다고 생각했지만 C++/OpenCV로는 충분하지 못했습니다. – OCW

관련 문제