前回の静止画を連続表示することで、
動画を表示してみました(fig.1 左画像)。
fi.1は、アプリケーションが起動すると、
左側に動画を表示します。
fig.1
次に、前回の静止画処理を付け加えました(fig.2 右側)。
左側の「ShowImage」ボタンを押すと、その瞬間の画像が
右側のピクチャボックスに表示されます。
※fig.1,2の画像は、カメラをディスプレイに向けて、撮影したものに
なっています。再帰的になってますね^^
以下にコードを示します。
---------------------view.h
ref class cvView
{
private:
public:
CvCapture *capture;
//カメラキャプチャ用の構造体IplImage *frameImage;
IplImage *Image;
//キャプチャ画像用のIplImageIplImage *CaptureImage;
//デフォルトコンストラクタ(カメラ初期化含む)void View(
void);
//カメラからの入力画像1フレームをframeImageに格納void cvInputFrame(
void);
//Imageの回転処理IplImage* cvSpinImage(IplImage* inputImage, int width,
int height,
double angle,
double scale);
//ImageをBitmap変換Bitmap^ cvConvertBitmap(
char* imageData,
int imageSize,
int imageWidth,
int imageHeight);
}
----------------------view.cpp
#include "StdAfx.h"
#include "View.h"
//デフォルトコンストラクタ;void cvView::View(
void){
//カメラ初期化capture = cvCreateCameraCapture(-1);
}
//カメラからの入力画像1フレームをframeImageに格納void cvView::cvInputFrame(
void){
frameImage = cvQueryFrame(capture);
}
//Imageの回転処理IplImage* cvView::cvSpinImage(IplImage* inputImage,
int width,
int height,
double angle, double scale){
//変換後の画像用IplImageIplImage* outputImage = cvCreateImage(cvGetSize(inputImage), IPL_DEPTH_8U, 3);
CvPoint2D32f center = cvPoint2D32f(width/2.0, height/2.0);
//行列を生成するCvMat *rotationMatrix = cvCreateMat(2, 3, CV_32FC1);
//変換行列を求めるcv2DRotationMatrix(center, angle, scale, rotationMatrix);
//画像の回転を行うcvWarpAffine(inputImage, outputImage, rotationMatrix, CV_INTER_LINEAR | CV_WARP_FILL_OUTLIERS, cvScalarAll(0));
return outputImage;
}
//ImageをBitmap変換Bitmap^ cvView::cvConvertBitmap(
char* imageData,
int imageSize,
int imageWidth,
int imageHeight){
Bitmap^ bmp = gcnew Bitmap( imageWidth, imageHeight, Imaging::PixelFormat::Format24bppRgb);
Imaging::BitmapData^ bmpData;
bmpData = bmp->LockBits(System::Drawing::Rectangle(0, 0, bmp->Width, bmp->Height), Imaging::ImageLockMode::ReadWrite, bmp->PixelFormat );
memcpy( bmpData->Scan0.ToPointer(), imageData, imageSize );
bmp->UnlockBits(bmpData);
return bmp;
}
------------------------------------------Form1.h
private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) {
//デフォルトコンストラクタ(カメラ初期化含む) view.View();
this->label1->Text = "Find Camera";
}
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
//ShowInmage btn view.cvInputFrame();
view.Image = view.cvSpinImage(view.frameImage, view.frameImage->width, view.frameImage->height, ANGLE, SCALE);
//取得、加工した画像をピクチャボックスに表示 pictureBox2->Image = view.cvConvertBitmap(view.Image->imageData, view.Image->imageSize, view.Image->width, view.Image->height);
}
private: System::Void pictureBox1_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) {
//動画表示 view.cvInputFrame();
view.Image = view.cvSpinImage(view.frameImage, view.frameImage->width, view.frameImage->height, ANGLE, SCALE);
pictureBox1->Image = view.cvConvertBitmap(view.Image->imageData, view.Image->imageSize, view.Image->width, view.Image->height);
}
private: System::Void button4_Click(System::Object^ sender, System::EventArgs^ e) {
//ImageSave btn //画像を保存 cvSaveImage("testCapture.bmp",view.CaptureImage);
}
};
}
以上です^^