2011-09-28 6 views
18

白黒画像を表す2Dナンシーアレイを3チャンネルのOpenCVアレイ(RGB画像)に変換しようとしています。私は次のようにPythonの経由でこれを行うにしようとしていますcode samplesthe docsに基づいてナンシーアレイをOpenCVアレイに変換する

:)、しかし

import numpy as np, cv 
vis = np.zeros((384, 836), np.uint32) 
h,w = vis.shape 
vis2 = cv.CreateMat(h, w, cv.CV_32FC3) 
cv.CvtColor(vis, vis2, cv.CV_GRAY2BGR) 

CvtColor(への呼び出しは、以下のCPP-レベルの例外を投げている:

OpenCV Error: Image step is wrong() in cvSetData, file /build/buildd/opencv-2.1.0/src/cxcore/cxarray.cpp, line 902 
terminate called after throwing an instance of 'cv::Exception' 
    what(): /build/buildd/opencv-2.1.0/src/cxcore/cxarray.cpp:902: error: (-13) in function cvSetData 

Aborted 

私は間違って何をしていますか?

+0

から'CvtColor'" src - ソースイメージ、8ビット符号なし、16ビット符号なし(CV_16UC ...)または単精度浮動小数点 "のドキュメント。私はあなたの数が少ない配列が 'np.uint32'であることに気づきます。これは、 'OpenCV Error:画像ステップがcvSetData'でwrong()であると説明するかもしれません。私は、コードサンプルが異なるデータ型を使用していることに気づきます。 'vis = np.zeros(max(h1、h2)、w1 + w2)、np.uint8)'を参照してください。 –

答えて

19

次のようにあなたのコードを固定することができます。

短い説明

import numpy as np, cv 
vis = np.zeros((384, 836), np.float32) 
h,w = vis.shape 
vis2 = cv.CreateMat(h, w, cv.CV_32FC3) 
vis0 = cv.fromarray(vis) 
cv.CvtColor(vis0, vis2, cv.CV_GRAY2BGR) 

  1. np.uint32データ型がOpenCVのではサポートされていないが(それがサポートuint8int8uint16int16int32float32float64
  2. cv.CvtColor numpy配列を処理できません。両方の引数をOpenCV型に変換する必要があります。 cv.fromarrayこの変換を行います。
  3. cv.CvtColorの両方の引数は同じ深さでなければなりません。だから、ソースタイプを32bit floatに変更してddestinationに合わせました。

また、私はそれが主要なデータ型としてnumpyの配列を使用していますので、あなたがOpenCVのPythonのAPIの新しいバージョンを使用することをお勧め:

import numpy as np, cv2 
vis = np.zeros((384, 836), np.float32) 
vis2 = cv2.cvtColor(vis, cv2.COLOR_GRAY2BGR) 
+0

ご協力ありがとうございます。それはまさにそれでした。 – Cerin

-1

これは私のために働いていたものです...

import cv2 
import numpy as np 

#Created an image (really an ndarray) with three channels 
new_image = np.ndarray((3, num_rows, num_cols), dtype=int) 

#Did manipulations for my project where my array values went way over 255 
#Eventually returned numbers to between 0 and 255 

#Converted the datatype to np.uint8 
new_image = new_image.astype(np.uint8) 

#Separated the channels in my new image 
new_image_red, new_image_green, new_image_blue = new_image 

#Stacked the channels 
new_rgb = np.dstack([new_image_red, new_image_green, new_image_blue]) 

#Displayed the image 
cv2.imshow("WindowNameHere", new_rgbrgb) 
cv2.waitKey(0)