3

私は opencv Mat を持っていますが、そのすべての要素に sin() を適用するにはどうすればよいですか? ループを使用して各要素を取得し、sin を 1 つずつ計算する必要がありますか? よろしく。

4

1 に答える 1

2

私はpythonを使用していて、numpyを使用しているので、次のことができます:

>>> import cv
>>> import numpy as np
>>> im = cv.LoadImageM("aaa.jpg")
>>> np.sin(im)
array([[[ 0.36319944,  0.46771851,  0.99646664],
        [ 0.98024565, -0.49104786,  0.46771851],
        [ 0.69605851, -0.9983471 , -0.49104786],
        ..., 
        [-0.58777064, -0.79041475,  0.60906792],
        [-0.79041475, -0.94252455,  0.36319944],
        [ 0.08839871, -0.58777064, -0.94252455]],
  etc...

それ以外の場合は、以下の python コードを適応させて、ルックアップ テーブルcv.LUTを作成して使用するのは簡単です。

import cv
import math

im = cv.LoadImageM("aaa.jpg")
dst = cv.CreateMat(im.height,im.width, cv.CV_32FC3)
lut_sin = cv.CreateMat(256, 1, cv.CV_32FC3)    

for i in xrange(256):     
    s = math.sin(i)
    cv.Set1D(lut_sin, i, (s,s,s,s))

cv.LUT(im,dst,lut_sin)

print cv.Get2D(dst,0,0)
#output, matches above:
(0.36319944262504578, 0.46771851181983948, 0.99646663665771484, 0.0)

浮動小数点データの場合、cv.PolarToCartを使用できます:

>>> import cv
>>> im = cv.LoadImageM("aaa.jpg")
>>> im2 = cv.CreateMat(im.height, im.width, cv.CV_32FC3)
>>> cv.Convert(im,im2)
>>> sin_of_angle = cv.CreateMat(im.height, im.width, cv.CV_32FC3)
>>> cv.PolarToCart(None,im2,None,sin_of_angle,0)
>>> cv.Get1D(sin_of_angle,0)
(0.36319947242736816, 0.46771851181983948, 0.99646669626235962, 0.0)
>>> cv.Get1D(sin_of_angle,1)
(0.98024564981460571, -0.49104788899421692, 0.46771851181983948, 0.0)

これを使用して、cos 値も簡単に取得できます。最後のパラメータをTrueラジアンに切り替えることができます。

于 2012-05-03T15:48:11.573 に答える