Cv

 view release on metacpan or  search on metacpan

lib/Cv/JA.pod  view on Meta::CPAN

C<Cv> の C<new()> でもできます。


=item Set()

=item m_set()

 $mat->Set($index, $value);

$index は配列のリファレンスで、より具体的に次のとおり書くことができます。

 $mat->Set([], $value);       # マトリクス $mat 全体に $value を代入する
 $mat->Set([$i], $value);     # マトリクス $mat の $i 行に〜
 $mat->Set([$i, $j], $value); # マトリクス $mat の $i 行 $j 列に〜

このように C<m_set()> は C<Set()> を拡張し、C<Set()> が 要素を 1つずつ
代入していたところで、要素をひとまとめに代入することを可能にします。

それは、C<$index> で指定されたマトリクスの要素の数と C<$value> で指定さ
れた要素の値の数のバランスがとれるように、C<$index> を補うか C<$value>
をばらし、そして、マトリクスの要素に値を 1つずつ代入するというものです。
インデクス C<$index> が C<$mat> の要素を特定するために十分でないときは、
足りないインデクスを補うために、C<$value> が値のリストなら C<$value> を
ばらして 1つずつ C<m_set()> で再帰的に処理します。つまり、

 $mat->m_set([@$index, $_], $value->[$_]) for 0 .. $#{$value};

そうでない (C<$value> をばらせない) ときは、次のとおり単にインデクスに
0 を補います。正確には、Nx1 のマトリクスの x1 のインデクスに相当する部
分を 0 で補うのがいいと思いますが、次に示す手抜きでも十分でしょう。

 $mat->m_set([@$index, 0], $value);


=item ToArray()

 my @array = $arr->ToArray();                                           # (1)
 my @array = $arr->ToArray($slice);                                     # (2)

シーケンスまたはマトリクス (1xN, Nx1) を Perl の点の配列に変換します。
シーケンスを変換する cvCvtSeqToArray() をマトリクスも変換できるように拡
張したものです。従って、範囲を与える $slice を指定することができます。
これは、cvSlice() で作るか、単にはじめ $start と終り $end を対にした配
列のリファレンス [$start, $end] で表わすことができます。省略したときは
$arr のすべての要素を変換します。

=back

=head1 Cv::Seq

OpenCV のシーケンスは、点、矩形、円など様々なデータを格納します。格納さ
れたデータを型なしで扱うスーパクラス L<Cv::Seq> と、データに合わせた変
換を行う派生クラス C<Cv::Seq::Point>, C<Cv::Seq::Rect>, ... に分け、デー
タに合わせて blessして使います。C言語のキャストのようなものです。

facedetect の一部を示します。HaarDetectObjects() は、検出した顔を複数の
CvRect 型のデータのリストにして返します。次の例は、シーケンスを
C<Cv::Seq::Rect> で bless して、顔を 1つずつ取り出します。

  my $faces = bless $image->HaarDetectObjects(
    $cascade, $storage, 1.1, 2, CV_HAAR_SCALE_IMAGE,
    cvSize(30, 30)), "Cv::Seq::Rect";
  while (my @rect = $faces->shift) {
    my ($x, $y, $w, $h) = @rect;
    ...
  }

同じ部分の C言語のコードを並べておきます。比べやすくするために、余分な
ものは省きました。

  CvSeq* faces = cvHaarDetectObjects(
    image, cascade, storage, 1.1, 2, CV_HAAR_SCALE_IMAGE,
    cvSize(30, 30));
  for (;;) {
    CvRect rect;
    cvSeqPopFront(faces, &rect);
    ...
  }

=head2 メソッド

=over

=item Cv->CreateSeq()

=item CreateSeq($seqFlags, $headerSize, $elemSize, $stor)

=item Cv::Seq->MakeSeqHeaderForArray($seqFlags, $headerSize, $elemSize, $stor)

=item Cv::Seq->new($seqFlags, $headerSize, $elemSize, $stor)

=item $seq->Push(@elem)

=item $seq->Pop()

=item $seq->Unshift(@elem)

=item $seq->Shift()

=item $seq->Splice()

	# splice($array, $offset, $length, @list)
	# splice($array, $offset, $length)
	# splice($array, $offset)

=back

=head2 メモリの解放

動的なメモリは、主にシーケンスを置く領域として使います。Cv の中はそれが
必要な呼出しにおいて与えられないとき、内部で確保することがあります。確
保した領域は $Cv::STORAGE に置きますが、動的なメモリは、使い方によって
は、その成長を制限する必要があります。OpenCV は cvClearMemStorage() を
呼んでリセットできるようにしていますが、Perl では、次のとおり local を
使うと簡単です。

 {
   local $Cv::STORAGE = $Cv::STORAGE;
   my $seq = Cv::Seq::Point->new();
   ...
 }

=head1 Cv::Histogram

L<Cv::Histogram> はヒストグラムを扱います。Cv::Histogram は、Cv の一部
を切り離したものなので、L</Cv::More>, L</Cv::Seq> と同様に使わないことを
明示しない限り取り込みます。

 use Cv;          # Cv::Histogram を使う
 use Cv -nohist;  # Cv::Histogram を使わない  

オブジェクトの作成は cvCreateHist を使います。いくつもの呼び方がありますが、



( run in 1.504 second using v1.01-cache-2.11-cpan-5837b0d9d2c )