VC 2010 C++/CLI + OpenCVで教えていただきたい事が有ります。
【教えていただきたい事】
・pbPictureの画像を透過処理して表示
※ 同じサイズの画像をアルファブレンドしたり、上面の画像の背景のみを透過するサンプルは見かけるのですが、
背面と異なるサイズの上面の画像全体を透過する、サンプルを見つけられませんでした。
(純粋に透過する機能がopenCVには無いとの事で、小細工が必要なのだと考えています)
【やりたいこと】
・pbBackground(Picturebox)に背景となる画像を読込表示
・pbPicture(Picturebox)に親フォームで作成したBMPの図形(画像)を半透明(透過率50%位)で重ねて表示
・pbBackgroundのサイズは読込データ依存
・pbPictureのサイズは親フォームで作成した図形依存
※つまり、pbBackgroundとpbPictureは違うサイズ
・将来的には、マウス移動でpbPictureの位置、大きさ、台形補間をする予定
イメージとしては、下記URLのお化け屋敷の画像とほぼ同じ
http://aidiary.hatenablog.com/entry/20061203/125 …
※実際は、背景が風景で、上書きする画像は建屋
【現状できているのは】
・cvLoadImageで画像を読込してpbBackgroundに描画
・親フォームで作成した図形を無加工でpbPictureに描画
【現状のソース】
System::Void PhotoRead_Click(System::Object^ sender, System::EventArgs^ e) {
double BmpX,BmpY,XYRatio;
double PhotoX,PhotoY;
int PX,PY;
System::Drawing::Point p;
System::String^ filename;
// pbBackgroundのディフォルトサイズは500×500
OpenFileDialog^ OpFile = gcnew OpenFileDialog(); //
OpFile->DefaultExt = "jpg";
OpFile->Filter = "画像ファイル(*.jpg;*.png;*.bmp;*.gif)|*.jpg;*.png;*.bmp;*.gif";
if (OpFile->ShowDialog() == Windows::Forms::DialogResult::OK) {
SuspendLayout();
filename = OpFile->FileName;
// String^型をchar*に安全に変換
char* pStr = (char*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi( filename ).ToPointer();
// ファイル読み込み
IplImage* img = cvLoadImage( pStr );
if( img == 0 ){
return;
}
// Bitmapに直接img->imgDataを読ませると、エラーになるのでコピーデータを渡す
IntPtr ip( new unsigned char[ img->widthStep * img->height ] );
memcpy( ip.ToPointer(), img->imageData, img->widthStep * img->height );
Bitmap^ bmp = gcnew Bitmap(img->width, img->height, img->widthStep, System::Drawing::Imaging::PixelFormat::Format24bppRgb, ip);
// 読み込みデータは解放
cvReleaseImage( &img );
//ピクチャボックスをビットマップ画像サイズに合わせる
BmpX = (double)bmp->Width;
BmpY = (double)bmp->Height;
PhotoX = 500;
PhotoY = 500;
p.X = 10;
p.Y = 40;
PX = 500;
PY = 500;
if (BmpX <= BmpY) {
XYRatio = BmpY / BmpX;
PX = (int)(PhotoX / XYRatio);
p.X = 10 + (500 - PX) /2;
} else {
XYRatio = BmpX / BmpY;
PY = (int)(PhotoY / XYRatio);
p.Y = 40 + (500 - PY) /2;
}
PictureBox^ pbBackground=gcnew PictureBox;
pbBackground->Location = p;
// サイズ指定、従来はWidthとHeightを別々に定義していたが、Sizeを使用すると1行で済む
pbBackground->Size=System::Drawing::Size(PX,PY);
//ピクチャボックスのImageへ読込画像をセット
pbBackground->SizeMode = PictureBoxSizeMode::StretchImage;
pbBackground->Image = bmp;
Controls->Add(pbBackground);
// ピクチャーボックスのpbBackgroundを親としているので、相対座標は0にする
BmpX = (double)PhotBMP->Width;
BmpY = (double)PhotBMP->Height;
PhotoX = pbBackground->Width;
PhotoY = pbBackground->Height;
GX = (int)(PX / 2 - 100) + p.X;
GY = (int)(PY / 2 - 100) + p.Y;
// PictureBoxのグラフィックエリアにBitmapを描画する。
PictureBox^ pbPicture=gcnew PictureBox;
pbPicture->Parent = pbBackground;
pbPicture->Location = System::Drawing::Point(GX, GY);
pbPicture->Size = System::Drawing::Size(200, 200);
pbPicture->SizeMode = PictureBoxSizeMode::StretchImage;
// 上書きする画像をセット
pbPicture->Image = PhotBMP;
Controls->Add(pbPicture);
// デバッグで見やすくするためにバックをどぎつい色に
BackColor=Color::FromArgb(0xFF,0xFF,0x00,0x00);
pbPicture->BringToFront();
pbCursor->BringToFront();
ResumeLayout();
}
}
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
>cvAddWeightedだと、同じサイズ、移動時は再計算、変形後の配列をどうするかなどなど、
>問題があって、cvAddWeightedでは実現できないと考えております。
cvAddWeighted を出したのはただの例です。
合成方法など無数にありますから、ご自分で用途に合う関数をお選びください。
>ROIは矩形しか対応していないと色々なところで記載されていたので、
>考えていなかったのですが、ROIで非対称の台形なども指定できるのでしょうか?
そんなことは自分で組み合わせてするのですよ。
OpenCV 自体は別に 3D に限定するものではない、汎用の画像処理ライブラリですから、台形変換がしたいのであれば、台形変換をすればいいのです。
幸いにも、cvWarpPerspective という関数で透視投影変換ができ、cvGetPerspectiveTransform で変換行列を簡単に求められます。
台形変換は透視投影変換の一種ですから、できますよね。
>移動時は再計算…など、問題があって…実現できないと考えております。
を見て思ったのですが、使い方を根本的に勘違いしていませんか?
OpenGL では GPU に処理ステージというものがあって、モデルビュー変換や投影変換はパラメータを指定すれば勝手にやってくれますが、
OpenCV は汎用の画像処理ライブラリですから、そのようなフレームワークは無く、変換同士の組み合わせや、パラメータが変わった時の再計算などは全部自分でやる必要があります。
No.1
- 回答日時:
アルファ合成をするには、例えば AddWeighted のような関数を使用します。
http://opencv.jp/opencv-2svn/c/core_operations_o …
ただし、既にご存知の通り、同じ合成する2者の画像は同じサイズでなければなりません。
> マスクを除くすべての入出力配列は,同じ型,同じサイズ(または ROI サイズ)でなければいけません.
異なるサイズの画像の中の一部に対して操作するには、ROI(Region Of Interest; 注目領域)というものを設定する必要があります。
http://opencv.jp/opencv-2svn/c/core_operations_o …
今回の場合ですと、背景画像の中の任意の座標に、上面画像と同じサイズのROIを設定してから合成するとよいでしょう。
この回答への補足
回答ありがとうございます。
cvAddWeightedだと、同じサイズ、移動時は再計算、変形後の配列をどうするかなどなど、
問題があって、cvAddWeightedでは実現できないと考えております。
OpenGLの様にZバッファを用いて、アルファ値を設定するだけで、背景が透過されるのが好ましいのですが、
GLはGLで色々制約があるので、CVで実現する方法があればと思い質問させていただきました。
ROIは矩形しか対応していないと色々なところで記載されていたので、
考えていなかったのですが、ROIで非対称の台形なども指定できるのでしょうか?
※CvPoint2D32fも矩形しか対応してなく、実際は長方形とひし形(頂点が対象)の物しかできないので、
やる前から諦めてました
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
uwscの画像認識に失敗します。
-
Excel ユーザーフォームで表示...
-
背景画像の繰り返しについて
-
複数枚画像の合成
-
C# VisualStudioでプロジェクト...
-
VBAのユーザーフォームのイメー...
-
Excelで画像URLを1つずつセル...
-
2値画像の一致度判定プログラム...
-
(UWSC)HPの画像を保存するプ...
-
VB6での画像のサイズ変更に関して
-
EXCEL VBA 複数のImageコントロ...
-
UWSCについて
-
jqueryスライダーを2段でスライ...
-
UWSCの色判定
-
UWSCを使って画像リンクをクリ...
-
スマホでサイトの画像を長押し→...
-
gif 画像上の ボタンに リン...
-
画像のピクセルデータの取得
-
メルカリのメルカードで買い物...
-
エクセルで、日付を入力すると...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EXCEL VBA 複数のImageコントロ...
-
背景画像の繰り返しについて
-
【EXCEL VBA】ダブルクリックで...
-
UWSCの色判定
-
Excel ユーザーフォームで表示...
-
uwcs のマクロで画像認識をして...
-
UWSC「画像が無い場合」
-
uwscの画像認識に失敗します。
-
スマホでサイトの画像を長押し→...
-
VBA シート毎に画像挿入
-
VBAのユーザーフォームのイメー...
-
vb.net 画像の透過について
-
PowerPoint VBA で画像の鮮明度...
-
画像処理したBitmapをピクチャ...
-
画像認識アルゴリズムについて
-
HTMLでサイトの模写をしていま...
-
gif 画像上の ボタンに リン...
-
「using Windows」でエラーが出る
-
【WPF】画像の切り替え
-
画像のピクセルデータの取得
おすすめ情報