1
0
Fork 0
mirror of https://github.com/ruby-opencv/ruby-opencv synced 2023-03-27 23:22:12 -04:00

added CvVideoWriter (not fully tested)

This commit is contained in:
ser1zw 2011-06-11 02:46:52 +09:00
parent bff95e942a
commit aae092dc04
5 changed files with 75 additions and 13 deletions

View file

@ -29,7 +29,7 @@ rb_class()
void
define_ruby_class()
{
if(rb_klass)
if (rb_klass)
return;
/*
* opencv = rb_define_module("OpenCV");
@ -45,8 +45,8 @@ define_ruby_class()
/*
* call-seq:
* CvVideoWriter.new(<i>filanem, fourcc, fps, size</i>) -> cvvideowriter
* CvVideoWriter.new(<i>filanem, fourcc, fps, size</i>){|vw| ... } -> nil
* CvVideoWriter.new(<i>filname, fourcc, fps, size[, is_color]</i>) -> cvvideowriter
* CvVideoWriter.new(<i>filname, fourcc, fps, size[, is_color]</i>){|vw| ... } -> nil
*
* Open new video writer. If block given, writer is closed automatically when end of block.
*
@ -55,8 +55,8 @@ define_ruby_class()
VALUE
rb_initialize(int argc, VALUE *argv, VALUE self)
{
VALUE filename, fourcc, fps, size;
rb_scan_args(argc, argv, "40", &filename, &fourcc, &fps, &size);
VALUE filename, fourcc, fps, size, is_color_val;
rb_scan_args(argc, argv, "41", &filename, &fourcc, &fps, &size, &is_color_val);
char codec[4] = {' ', ' ', ' ', ' '};
int codec_number;
Check_Type(filename, T_STRING);
@ -69,19 +69,27 @@ rb_initialize(int argc, VALUE *argv, VALUE self)
if (RSTRING_LEN(fourcc) > 4)
rb_raise(rb_eStandardError, "argument 2 (fourcc) should be specific 4-character. (i.e \"PIM1\",\"MJPG\")");
else {
for (int i = 0; i < RSTRING_LEN(fourcc); i++)
int len = RSTRING_LEN(fourcc);
for (int i = 0; i < len; ++i)
codec[i] = RSTRING_PTR(fourcc)[i];
codec_number = CV_FOURCC(codec[0], codec[1], codec[2], codec[3]);
}
}
DATA_PTR(self) = cvCreateVideoWriter(StringValueCStr(filename), codec_number, FIX2INT(fps), VALUE_TO_CVSIZE(size));
int is_color;
if (NIL_P(is_color_val))
is_color = 1;
else
is_color = (is_color_val == Qtrue) ? 1 : 0;
DATA_PTR(self) = cvCreateVideoWriter(StringValueCStr(filename), codec_number,
NUM2DBL(fps), VALUE_TO_CVSIZE(size), is_color);
if (rb_block_given_p()) {
rb_yield(self);
rb_close(self);
return Qnil;
} else {
return self;
}
else
return self;
}
/*
@ -107,7 +115,8 @@ VALUE
rb_close(VALUE self)
{
CvVideoWriter *writer = CVVIDEOWRITER(self);
cvReleaseVideoWriter(&writer);
if (writer)
cvReleaseVideoWriter(&writer);
return Qnil;
}

View file

@ -31,9 +31,11 @@ __NAMESPACE_END_CVVIDEOWRITER
inline CvVideoWriter*
CVVIDEOWRITER(VALUE object)
{
CvVideoWriter *ptr;
Data_Get_Struct(object, CvVideoWriter, ptr);
return ptr;
// CvVideoWriter is
// CvVideoWriter *ptr;
// Data_Get_Struct(object, CvVideoWriter, ptr);
// return ptr;
return (CvVideoWriter*)DATA_PTR(object);
}
__NAMESPACE_END_OPENCV

View file

@ -765,6 +765,7 @@ extern "C"{
mOpenCV::cCvSparseMat::define_ruby_class();
mOpenCV::cCvHistogram::define_ruby_class();
mOpenCV::cCvCapture::define_ruby_class();
mOpenCV::cCvVideoWriter::define_ruby_class();
mOpenCV::cCvLine::define_ruby_class();
mOpenCV::cCvTwoPoints::define_ruby_class();

View file

@ -115,6 +115,7 @@ extern "C"{
#include "cvsparsemat.h"
#include "cvhistogram.h"
#include "cvcapture.h"
#include "cvvideowriter.h"
#include "cvline.h"
#include "cvtwopoints.h"

49
test/test_cvvideowriter.rb Executable file
View file

@ -0,0 +1,49 @@
#!/usr/bin/env ruby
# -*- mode: ruby; coding: utf-8-unix -*-
require 'test/unit'
require 'opencv'
require File.expand_path(File.dirname(__FILE__)) + '/helper'
include OpenCV
# Tests for OpenCV::CvVideoWriter
class TestCvVideoWriter < OpenCVTestCase
def test_initialize
vw = CvVideoWriter.new('foo.avi', 'MJPG', 15, CvSize.new(320, 240))
assert_equal(CvVideoWriter, vw.class)
vw.close
vw = CvVideoWriter.new('foo.avi', 'MJPG', 15, CvSize.new(320, 240), false)
assert_equal(CvVideoWriter, vw.class)
vw.close
## Supported only Windows(?)
# vw = CvVideoWriter.new('foo.avi', nil, 15, CvSize.new(320, 240), false)
# assert_equal(CvVideoWriter, vw.class)
# vw.close
CvVideoWriter.new('foo.avi', 'MJPG', 15, CvSize.new(320, 240)) { |vw|
assert_equal(CvVideoWriter, vw.class)
}
assert_raise(TypeError) {
vw = CvVideoWriter.new(123, 'MJPG', 15, CvSize.new(320, 240), false)
}
end
def test_write
vw = CvVideoWriter.new('foo.avi', 'MJPG', 15, CvSize.new(256, 256))
vw.write CvMat.load(FILENAME_LENA256x256)
vw.close
CvVideoWriter.new('foo.avi', 'MJPG', 15, CvSize.new(256, 256)) { |vw|
vw.write CvMat.load(FILENAME_LENA256x256)
}
end
def test_close
vw = CvVideoWriter.new('foo.avi', 'MJPG', 15, CvSize.new(320, 240))
vw.close
end
end