2017-02-25 1 views
1

をPythonのために私は、Pythonに次のOpenCVのC++を変換しようとしています:の変換C++のcopyTo

CPP:

//step1 
Mat edges; 
adaptiveThreshold(vertical, edges, 255, CV_ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 3, -2); 
imshow("edges", edges); 
// Step 2 
Mat kernel = Mat::ones(2, 2, CV_8UC1); 
dilate(edges, edges, kernel); 
imshow("dilate", edges); 
// Step 3 
Mat smooth; 
vertical.copyTo(smooth); 
// Step 4 
blur(smooth, smooth, Size(2, 2)); 
// Step 5 
smooth.copyTo(vertical, edges); 
// Show final result 
imshow("smooth", vertical); 

私のpythonにSTEP3を変換処理するのかどうかはわかりません。私は単純に画像のコピーを作成し、Pythonで以下のようにあなたのケースで

#step1 
edges = cv2.adaptiveThreshold(vertical,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,3,-2) 

#step2 
kernel = np.ones((2, 2), dtype = "uint8") 
dilated = cv2.dilate(edges, kernel) 

答えて

2

cv::Mat::copyToをSTEP1と2を行っています。実際に、それをどのように使用しているかは、マスクを指定していないので、cv::Mat::cloneを使用するのと同じです。ステップ#5の場合

# Step #3 
smooth = vertical.copy() 

、あなたが今、マスクに基づいてコピーしている:Pythonでそのように、OpenCVのが主なデータ型としてnumpyのアレイを使用するようnumpy.copyメソッドを使用します。私はすでに私の以前の投稿でそれを行う方法に答えました:Equivalent of copyTo in Python OpenCV bindings?。コピーしようとしている行列が既に割り当てられていて、マスク内の値がゼロ以外の値だけをコピーしたいという状況が2番目です。しかし、完全性のために私はあなたのためにここに入れます。

は、smoothを使用して変更しますが、edgesの非ゼロ要素で定義されたsmoothの要素をコピーするだけです。 numpy.whereを使用して、ゼロ以外の行と列の位置を見つけて、これらを使用してsmoothverticalの間の正しい値をコピーすることができます。グレースケールの画像があるように見えるので、さらに簡単になります。

# Step #5 
(rows, cols) = np.where(edges != 0) 
vertical[rows, cols] = smooth[rows, cols] 
+1

ありがとう!これは今や理にかなっている。また、ステップ5で説明したことは非常に有益です。より大きなコンテキストでは、私はC + +のコードをPythonに変換しようとしています。私はそれをしましたが、結果が同じではないので、間違っていると思われます。私は別の質問を投稿しました。私は本当にあなたの入力を感謝しますhttp://stackoverflow.com/questions/42453892/converting-c-opencv-to-python – Anthony

+0

あなたは大歓迎です。私は今眠る必要がありますが、目が覚めるとあなたの質問を調べます。 – rayryeng