出産前後の痔にはご注意!

VC++でOpenCVを使って画像処理を研究中です。
OpenCVでの画像の表示は、


char *filename = "lena.jpg";
image = cvLoadImage(filename, CV_LOAD_IMAGE_COLOR);
cvNamedWindow ("lena", CV_WINDOW_AUTOSIZE);
cvShowImage ("lena",image);

で出来るということは分かりました。
しかし、MFCで作ったフォームのピクチャーボックスへの表示の仕方が分かりません。
画像処理は実行ボタンでpictureBox1の元の画像をpictureBox2に表示させようと考えております。

回答のほど、どうぞよろしくお願いいたします。
また、分かりやすいサイトなどありましたらお願いします。

このQ&Aに関連する最新のQ&A

とは MFC」に関するQ&A: MFC71.DLLとは

A 回答 (1件)

MFCのピクチャーボックスはStaticコントロールですので Bitmap(またはCBitmap)なら表示可能です



そのダイアログクラスに CBitmap型の変数を準備します

img = cvLoadImage( filename, 1 );
// ビットマップ用のカラーバッファ
char* ColorBuf = (char*)calloc( sizeof(char), img->widhth * img->Height * 4 );
for( int y = 0; y < img->height; y++ ) {
  for( int x = 0; x < img->width; x++ ) {
    // Blue
    ColorBuf[ y * img->width + x * 4 + 0 ] =
      img->imageData[ y * img->widthStep + x * 3 + 0 ];
    // Green
    ColorBuf[ y * img->width + x * 4 + 1 ] =
      img->imageData[ y * img->widthStep + x * 3 + 1 ];
    // Red
    ColorBuf[ y * img->width + x * 4 + 2 ] =
      img->imageData[ y * img->widthStep + x * 3 + 2 ];
  }
}
m_bmp.CreateBitmap( img->width, img->height, 1, 32, ColorBuf );
free( ColorBuf );

((CStatic*)GetDlgItem( IDC_IMGSRC ))->SetBitmap ( m_bmp );
cvReleaseImage( &img );
といった具合でしょう

ダイアログに貼り付けたピクチャーコントロールはプロパティの設定でBitmapにしておきましょう
またリソースIDも『IDC_STATIC』以外のものに変更することをお忘れなく
上記の例では IDC_IMGSRC だと仮定しています

この回答への補足

早速の回答ありがとうございます。
処理後の画像を表示するころができました。
しかし、バグったように表示されてしまいます。
ピクチャーボックスの上の方に、画像が4つ並んで表示されています。

何か改善すべきところはあるでしょうか?
よろしくお願いいたします。

補足日時:2008/10/21 16:36
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QMFC - ダイアログボックスのPictureControlへの画像表示

はじめまして。
現在MFCにおいて、ダイアログ形式のアプリケーションを作成しています。環境はVisual Studio 2005になります。
内容はWebカメラからのキャプチャを行い、そのキャプチャされた画像をダイアログ上に配置したPictureControlへ表示するというものです。

キャプチャされた画像は、1チャネルのグレースケールでありunsigned char型の1次元配列で格納されています。よってビットマップとして表示するには自身で構造体BITMAPINFOを作成しなければなりません。現状以下のように作成したのですが、うまく表示されません。

画像サイズは 320×240 です。
PictureControlのIDを IDC_BITMAP と設定し、
画素情報が格納されている配列を m_pbit とします。

int i;
CWnd *pWnd = GetDlgItem( IDC_BITMAP );
CDC *Capt = pWnd->GetDC();
BITMAPINFO bmif;

bmif.bmiHeader.biBitCount   =8;
bmif.bmiHeader.biClrImportant =0;
bmif.bmiHeader.biClrUsed    =256;
bmif.bmiHeader.biCompression  =0;
bmif.bmiHeader.biHeight     =240;
bmif.bmiHeader.biPlanes     =1;
bmif.bmiHeader.biSize      =sizeof(BITMAPINFOHEADER);
bmif.bmiHeader.biSizeImage   =320*240;
bmif.bmiHeader.biWidth     =320;
bmif.bmiHeader.biXPelsPerMeter =0;
bmif.bmiHeader.biYPelsPerMeter =0;

for(i=0; i<256; i++){
 bmif.bmiColors[i].rgbBlue = i;
 bmif.bmiColors[i].rgbGreen = i;
 bmif.bmiColors[i].rgbRed  = i;
 bmif.bmiColors[i].rgbReserved = 0;
}

SetDIBitsToDevice(Capt->m_hDC, 0, 0, 320, 240, 0, 0, 0, 240, m_pbit, &bmif, DIB_RGB_COLORS);

グレースケール画像なので配列bmiColorsは全て同色としました。
また、PictureControlのTypeをオーナ描画など全てのTypeを試しましたが、表示されませんでした。

必ずPictureControlに描画しなければならないという決まりはないのですが、ダイアログボックスにビットマップを表示するにはPictureControlだと考え、それに表示するようプログラムを組みました。

画素情報(グレースケールの輝度情報)のみ既知である状態からビットマップをダイアログに表示するためには他に方法があるのでしょうか?
上記のプログラムにおける間違い、またその他の方法についてアドバイスを頂けたらと思います。

よろしくお願いいたします。

はじめまして。
現在MFCにおいて、ダイアログ形式のアプリケーションを作成しています。環境はVisual Studio 2005になります。
内容はWebカメラからのキャプチャを行い、そのキャプチャされた画像をダイアログ上に配置したPictureControlへ表示するというものです。

キャプチャされた画像は、1チャネルのグレースケールでありunsigned char型の1次元配列で格納されています。よってビットマップとして表示するには自身で構造体BITMAPINFOを作成しなければなりません。現状以下のように作成したのですが、うま...続きを読む

Aベストアンサー

 こんにちは。
 パレットサイズ(biClrUsedの数字)の分だけRGBQUADの配列を拡張して割り当てないといけません。
 正しくは、以下です。実際には、予め割り当てておくのが良いでしょう。

//割り当てる
LPBITMAPINFO pbmi = static_cast<LPBITMAPINFO>(::malloc(sizeof(BITMAPINFOHEADER) + (sizeof(RGBQUAD) * 256)));

pbmi->bmiHeader.biBitCount=8;
pbmi->bmiHeader.biClrImportant=0;
pbmi->bmiHeader.biClrUsed=256;
pbmi->bmiHeader.biCompression=0;
pbmi->bmiHeader.biHeight=240;
pbmi->bmiHeader.biPlanes=1;
pbmi->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
pbmi->bmiHeader.biSizeImage=320*240;
pbmi->bmiHeader.biWidth=320;
pbmi->bmiHeader.biXPelsPerMeter=0;
pbmi->bmiHeader.biYPelsPerMeter=0;

for(i=0;i<256;i++)
{
pbmi->bmiColors[i].rgbBlue=i;
pbmi->bmiColors[i].rgbGreen=i;
pbmi->bmiColors[i].rgbRed=i;
pbmi->bmiColors[i].rgbReserved=0;
}

::SetDIBitsToDevice(Capt->m_hDC, 0, 0, 320, 240, 0, 0, 0, 240, m_pbit, pbmi, DIB_RGB_COLORS);

//開放する
::free(pbmi);
--------------------------------------------------------------------------------------------------------------
強引ですが、以下の様なやり方も出来ます。

struct BMI
{
BITMAPINFOHEADER bmiHeader;
RGBQUAD arrPalette[256];
};

//キャストする
BMI bmi;
LPBITMAPINFO pbmi = reinterpret_cast<LPBITMAPINFO>(&bmi);

//ヘッダとパレットの代入をする
pbmi->bmiHeader.biBitCount=...

//使用する
::SetDIBitsToDevice(...)

//開放は必要ない

 こんにちは。
 パレットサイズ(biClrUsedの数字)の分だけRGBQUADの配列を拡張して割り当てないといけません。
 正しくは、以下です。実際には、予め割り当てておくのが良いでしょう。

//割り当てる
LPBITMAPINFO pbmi = static_cast<LPBITMAPINFO>(::malloc(sizeof(BITMAPINFOHEADER) + (sizeof(RGBQUAD) * 256)));

pbmi->bmiHeader.biBitCount=8;
pbmi->bmiHeader.biClrImportant=0;
pbmi->bmiHeader.biClrUsed=256;
pbmi->bmiHeader.biCompression=0;
pbmi->bmiHeader.biHeight=240;
pbmi->b...続きを読む

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

QCStaticコントロールの静的イメージ描画

はじめまして、質問させてください。

VC++ 2005 MFC で開発しております。

Picture Control(DDX CStasic型)に
イメージ(外部ファイル JPG)を静的に描画させたいのですが
方法がわかりません。

お詳しい方がおられましたら、ご教授お願いいたします。

ちなみに
CImageを使用して描画はできるのですが
その場合、OnPaintをオーバーライドして
描画更新処理を書かないと一度だけ描画されて終わって
しまうと思います。

CStaic変数にロードしたら
再度ロードされるまで
ずっと描画させていたいです。

以上になります。
宜しくお願いいたします。

Aベストアンサー

SelectObjectで選択するとその時まで選択されていたデバイスハンドルを返してきます
そのハンドルを一時変数に保存しておいて描画後に戻してやるのです

CBitmap* pOld = m_dcMem.SelectObject( &m_bmpMem );
といった具合で記憶して描画処理を行います
使用後に
m_dcMem.SelectObject( pOld );
といった具合にして m_bmpMemをDCからはずします
この後
m_ctlImage.SetBitmap( m_bmpMem );
といった具合に選択してやればできると思います

CStaticのTypeはビットマップで無いとSetBitmapでイメージを表示しません

QCStringからchar*への型変換について教えてください。

以前の質問に

int型 → CString型/char型

がありましたが、

CString型をchar*型に変換する方法を
教えていただければありがたいです。

MSDNで「LPCTSTRキャスト」が説明されていましたが、
例が載ってないのでよくわかりませんでした。

よろしくお願いします。

Aベストアンサー

目的にもよりますが一時的にchar配列として使いたいならCString::GetBuffer()が利用できます。
char配列としての利用が終わったらCString::ReleaseBuffer()する必要がありますが。

直接CString内の文字列を扱う必要があるならCString::operator LPCTSTRで文字列ポインタが得られます。
ただし、CStringオブジェクトをいじると無効ポインタなる可能性があるので気をつけてください。

MSDNのMicrosoft Foundation Classリファレンス→CString→クラスメンバで確認してください。

QVC++プログラムをつかったBMP画像の拡大縮小について

現在VC++をつかった画像を扱うプログラミングを学習中なのですが、画像データの取り扱いについてわからないことがあるため教えていただきたいです。

BMP画像をバッファに取り込んだあとで、画像の縦横を拡大縮小したデータを新たなバッファに格納したいのですが、画像を拡大縮小する方法がわかりません。いくつかのプログラムのソースを見させていただいたのですが、BITMAPINFOHEADER構造体の中のbiWidthやbiHeightの値を変えているだけのようなのです。

これらの値を変えるだけで、指定した幅と高さに変換された画像データが得られるのでしょうか?
また、それで拡大縮小されるならば、変換された画像データは輝度情報が滑らかになるように何かしらの補正が加えられていたりするのでしょうか?それとも、途中途中の輝度を単純に抜いていたりするだけなのでしょうか。
その辺の原理についても教えていただけるとうれしいです。

お手数をかけますが、よろしくお願いします。

Aベストアンサー

> 実際に拡大縮小された画像のデータ(バッファ)がどこに格納されたのかわかりません・・・。

一般的には、メモリやVRAMに載ります。取得もできますが、DIBSectionを使うと、メモリとして参照しやすいです。

> また、StretchBlt関数は、描画を目的としているようなのですが、今回の場合、
> -- snip --
> 描画は無駄な手間のように思われます。

実際の画面に表示するかにかかわらず、WindowsのAPIにおける画像の操作は原則として「DC」という概念を使います。
メモリやプリンタもDCの一種と扱われますし、必ずしも画面描画は意味しません。
ビットマップに何か書くのも、DCと関連付けてそこに描画する仕組みです。

メモリ上で拡大縮小するということは、結局のところ突き詰めれば
元画像を読んで拡大縮小した画像をそこ(メモリ上)に描画している、
ということだと思いますが、いかがでしょう。

# C言語の入出力がコンソールにもファイルにも使えるようにFILE*を使うのとかと大差ない、
# DCってのはWindowsにおける「描画先」の抽象化された概念です。

> 何かスマートな方法はないものでしょうか?

DCという概念自体はWindows GDIの根底ですから、WindowsのAPIである限り、
他を使ってもIFは違えど内部的にはDCと大差ないと思われますが。
「質問者さんにとってのスマート」が不明ですが、自前で変換処理を書くか、
完全独自処理の画像変換ライブラリを持ってくるのがスマートですか。

> 実際に拡大縮小された画像のデータ(バッファ)がどこに格納されたのかわかりません・・・。

一般的には、メモリやVRAMに載ります。取得もできますが、DIBSectionを使うと、メモリとして参照しやすいです。

> また、StretchBlt関数は、描画を目的としているようなのですが、今回の場合、
> -- snip --
> 描画は無駄な手間のように思われます。

実際の画面に表示するかにかかわらず、WindowsのAPIにおける画像の操作は原則として「DC」という概念を使います。
メモリやプリンタもDCの一種と扱われま...続きを読む

Qビットマップに描画をしてピクチャーコントロールに貼り付けるためには?

ビットマップに描画をしてピクチャーコントロールに貼り付けるためには
どうすればよいでしょうか?

ネットで検索しましたそして、
下のようなコードを書きましたがうまくゆきません。


void CXXXView::OnButton()
{


CStatic m_ctlImage; // ピクチャーボックスに関連付けした変数
CBitmap m_bmpImage; // ピクチャーボックスに貼り付けるイメージ
CDC m_dcImage; // Bitmap描画用のDC


CDC* pDC = m_ctlImage.GetDC();
m_dcImage.CreateCompatibleDC(pDC);

CRect Cltsz;
picture1.GetClientRect(&Cltsz);

m_bmpImage.CreateCompatibleBitmap(pDC,Cltsz.Width(),Cltsz.Height());

CBitmap* pOld=m_dcImage.SelectObject(&m_bmpImage);


CPen myPEN(PS_SOLID,5,RGB(0,0,255));
CPen* oldPEN=m_dcImage.SelectObject(&myPEN);
m_dcImage.MoveTo(10,10);
m_dcImage.LineTo(100,100);

m_dcImage.SelectObject(oldPEN);

m_dcImage.SelectObject(pOld);

m_ctlImage.SetBitmap(m_bmpImage);

}

この様にしましたが、ピクチャーコントロールには
何も描画されません、

何故でしょうか?

VS2005で、ボタンをクリックした
イベントで描画する場合です、

直線とかは、問題なく描画できました。

ビットマップに描画して貼り付けたいのです、

よろしくお願いします

ビットマップに描画をしてピクチャーコントロールに貼り付けるためには
どうすればよいでしょうか?

ネットで検索しましたそして、
下のようなコードを書きましたがうまくゆきません。


void CXXXView::OnButton()
{


CStatic m_ctlImage; // ピクチャーボックスに関連付けした変数
CBitmap m_bmpImage; // ピクチャーボックスに貼り付けるイメージ
CDC m_dcImage; // Bitmap描画用のDC


CDC* pDC = m_ctlImage.GetDC();
m_dcImage.CreateCompatibleDC(pDC);

CRect Cltsz;
picture1.G...続きを読む

Aベストアンサー

CStatic型とCBitmap型の変数は クラスのメンバー変数にします

ViewクラスのOnCreateなどでm_ctlImageのインスタンスを作成しておきます

ボタンのOnClickイベントで
CDC* pDC = m_ctlImage.GetDC();
CDC* pMemDC = new CDC;
pMemDC->CreateCompatibleDC( pDC );
m_ctlImage.ReleaseDC( pDC );
if (m_bmpImage.m_hObject != NULL ) {
  // 前回作成オブジェクトを破棄する
  m_bmpImage.DeleteObject();
}
CRect rc;
m_ctlImage.GetClientRect( &rc );
m_bmpImage.CreateCompatibleBitmap( pMemDC, rc.Width(), rc.Height() );
CBitmap* pold = pMemDC->SelectObject( &m_bmpImage );
CPen myPen(PS_SIOLID, 5, RGB( 0, 0, 255 ) );
PCen*pOldPen = pMemDC->SelectObejct( &myPen );
pMemDC->MoveTo(10, 10 );
pMemDC->Lineto( 100, 100 );
pMemDC->SelectObejct( pOld );
pMemDC->SelectObject( pOldPen );
pMemDC->DeleteDC();
delete pMemDC;

m_ctlImage->setImage( m_bmpImage );
といった具合です

ご質問のコードではm_ctlImage.GetDC()でアサートが発生しませんか
ローカル変数のCBitmapでは関数から出た時点で破棄されてしまうので
スタティックコントロールが再描画される時点では 無効なビットマップハンドルになってしまうため描画されないのだと思います

CStatic型とCBitmap型の変数は クラスのメンバー変数にします

ViewクラスのOnCreateなどでm_ctlImageのインスタンスを作成しておきます

ボタンのOnClickイベントで
CDC* pDC = m_ctlImage.GetDC();
CDC* pMemDC = new CDC;
pMemDC->CreateCompatibleDC( pDC );
m_ctlImage.ReleaseDC( pDC );
if (m_bmpImage.m_hObject != NULL ) {
  // 前回作成オブジェクトを破棄する
  m_bmpImage.DeleteObject();
}
CRect rc;
m_ctlImage.GetClientRect( &rc );
m_bmpImage.CreateCompatibleBitmap( pMe...続きを読む

QOpenCV でのROIの指定方法について

いつもお世話になっております.
OpenCVに関する質問です.
FastFeatureDetectorやGoodFeaturesToTrackDetector等の特徴点検出器を入力画像の特定の部分に対して行うために,入力画像に対してROIを設定したのですが上手くいかない場合があって困っています.

たとえば,
入力画像(640*480)に対して,
左上(0,0)右下(640,480)や左上(0,0)右下(320,240)を矩形領域を指定すれば上手くいくのですが,
左上(10,10)右下(640,480)や左上(320,240)右下(640,480)だと,結果がズレてしまいます.

下記のソースコードで
---------------------------------------------------------------
cv::Rect* roi = new cv::Rect(roi_x, roi_y, roi_w, roi_h);
cv::Mat* InuptImage = new cv::Mat(640, 480, CV_8UC1, data);//dataはbyte型
InuptImage = new cv::Mat(*InuptImage, *roi);
---------------------------------------------------------------
(roi_x, roi_y, roi_w, roi_y)が
(0, 0, 640, 480)や(0, 0, 320, 240)の場合は上手くいくのですが,
(10, 10, 630, 470)や(320, 240, 320, 240)の場合には,特徴点の位置がずれたり,全体的に縮小されたりします.

どこに問題があるのでしょうか?

OpenCVは2.3で,言語はC++です.
アドバイス宜しくお願い致します.

いつもお世話になっております.
OpenCVに関する質問です.
FastFeatureDetectorやGoodFeaturesToTrackDetector等の特徴点検出器を入力画像の特定の部分に対して行うために,入力画像に対してROIを設定したのですが上手くいかない場合があって困っています.

たとえば,
入力画像(640*480)に対して,
左上(0,0)右下(640,480)や左上(0,0)右下(320,240)を矩形領域を指定すれば上手くいくのですが,
左上(10,10)右下(640,480)や左上(320,240)右下(640,480)だと,結果がズレてしまいます.

下記のソースコードで
---...続きを読む

Aベストアンサー

オフセットは必ず必要です。ROIを指定する前の画像の全体のサイズと、本来の画像の左上から、ROIの左上の座標のオフセットは、locateROI メソッドで取得することができます。

実際には、オフセットを考慮して点群座標を変換するか、特徴点を描画したい場合などでは、元の画像ではなく ROI で切り取った画像に対して描画を行います。


参考まで。



// okwave01.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"
#include <opencv2/opencv.hpp>

int main(int argc, char argv[])
{
const std::string FILE_PATH("lena.jpg");
//sample.bmpは640*480のRGBの画像

cv::Mat rgb_img = cv::imread(FILE_PATH);
// 画像読み込み

cv::Mat gray_img;
cv::cvtColor(rgb_img, gray_img, CV_BGR2GRAY);
// グレースケール画像に変換

const cv::Point ROI_TL(rgb_img.rows * 0.25, rgb_img.cols * 0.25);
const cv::Rect RECT(
rgb_img.rows * 0.25, rgb_img.cols * 0.25,
rgb_img.rows * 0.5, rgb_img.cols * 0.5);
// 中心 だけを切り取る ROI を作成。

cv::Mat rgbimage_roi = rgb_img(RECT);
cv::Mat grayimage_roi = gray_img(RECT);
// ROI による切り取り。


std::vector<cv::KeyPoint> corners;
// FAST 頂点座標の保存用変数

cv::FAST(grayimage_roi, corners, 10, true);

for (auto it = corners.begin(); it != corners.end(); ++it) {
cv::circle(grayimage_roi, it->pt, 1, cv::Scalar(255), 2);
// ROI を通してグレイスケール画像に書き込む

cv::circle(rgb_img, ROI_TL + cv::Point2i(it->pt), 1, cv::Scalar(0, 0xff, 0), 2);
// オフセットを考慮して直接RGB画像に書き込む
}

cv::imshow("RGB IMAGE", rgb_img);
cv::imshow("GRAY IMAGE", gray_img);
return cv::waitKey();
}

オフセットは必ず必要です。ROIを指定する前の画像の全体のサイズと、本来の画像の左上から、ROIの左上の座標のオフセットは、locateROI メソッドで取得することができます。

実際には、オフセットを考慮して点群座標を変換するか、特徴点を描画したい場合などでは、元の画像ではなく ROI で切り取った画像に対して描画を行います。


参考まで。



// okwave01.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"
#include <opencv2/opencv.hpp>

int main(int argc...続きを読む

Qダイアログ内コントロールの位置取得について

いつもお世話になっております。

ダイアログ内に配置されているコントロールの位置の取得方法について
ご教授頂きたく質問させていただきました。

私が試したところGetWindowRect( コントロールハンドル, &rc );
とするとありえないぐらい大きな座標が帰ってきます。

上記の方法ではうまくいきません。
ご教授よろしくお願いいたします。

Aベストアンサー

>http://msdn.microsoft.com/ja-jp/library/cc364604.aspx
より
>クライアント座標はクライアント領域の左上端からの相対座標なので、左上端の座標は常に (0,0) となります。
となっているため
>GetClientRectでダイアログ内の相対位置を取れます。
は間違っていました。

>もしかしたら便利な関数が存在するのでしょうか?
ないのかなぁと。
かわりにこんな関数を作っておくとか。

BOOL GetDlgItemRect(HWND hDlg, int nIDDlgItem, RECT* rct)
{
  BOOL bRet = FALSE;
  HWND hWnd = GetDlgItem(hDlg, nIDDlgItem);
  if (hWnd != NULL)
  {
    bRet = GetWindowRect(hWnd, rct);
    {
      bRet = ScreenToClient(hDlg, rct);
    }
  }
  return bRet;
}

>http://msdn.microsoft.com/ja-jp/library/cc364604.aspx
より
>クライアント座標はクライアント領域の左上端からの相対座標なので、左上端の座標は常に (0,0) となります。
となっているため
>GetClientRectでダイアログ内の相対位置を取れます。
は間違っていました。

>もしかしたら便利な関数が存在するのでしょうか?
ないのかなぁと。
かわりにこんな関数を作っておくとか。

BOOL GetDlgItemRect(HWND hDlg, int nIDDlgItem, RECT* rct)
{
  BOOL bRet = FALSE;
  HWND hWnd = GetDlgIt...続きを読む

Qmsvcr120d.dllがないというエラー

VSC++でDLLのプラグインを作成しました。
このプラグインをモーションビルダーで使用します。

自分の開発していたPCでは問題なく起動し、動作しています。
しかし、VS環境のないPCで使用しようとしたところ次のようなエラーが出て読み込まれませんでした。

・msvcr120d.dllがない
・msvcp120d.dllがない

これに対応するにはどうしたら良いかわかりません。
プログラムのほうで何かをして対応できますか?
使用するPC側にインストール等が必要になりますか?

Aベストアンサー

まずは、Releaseモードに切り替えましょう。Debugとか論外でしょ。

あと、
http://kidd0320.hatenablog.com/entry/2014/06/06/142355
上記を参考に、「ランタイムライブラリ」を「DLL」の記載が無いものに切り替えましょう。

QVC++から引数付きexeファイルの実行

タイトルの通り、VC++から外部ファイルを実行したいのですがどのような関数を使えばよいのでしょうか?
exeファイルを実行中は親プロセスであるVCのプログラムの方を止めておきたいのです。
出来ればexeファイルは引数付きで実行したいと思いますので、よろしくお願いします。
開発環境はVisualStudio2005です。

Aベストアンサー

#1です。こちらで作成したサンプルです。
呼び出し側
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
intret;
printf("system試験開始\n");
ret = system("C:\\VCSTUDY\\printarg\\Debug\\printarg.exe XXX YYY ZZZ");
if (ret == 0){
printf("system成功\n");
}else{
printf("system失敗\n");
}
return 0;
}
----------------------

呼び出される側(c:\\test.exeに相当)
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
inti;
for (i = 0; i < argc; i++){
printf("ARGV[%d]=%s\n",i,argv[i]);
}
return 0;
}
以下、実行結果です。
コマンドプロンプト画面に下記の文字が出力されます。
------------------------
system試験開始
ARGV[0]=C:\VCSTUDY\printarg\Debug\printarg.exe
ARGV[1]=XXX
ARGV[2]=YYY
ARGV[3]=ZZZ
system成功
Press any key to continue
---------------------------

#1です。こちらで作成したサンプルです。
呼び出し側
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
intret;
printf("system試験開始\n");
ret = system("C:\\VCSTUDY\\printarg\\Debug\\printarg.exe XXX YYY ZZZ");
if (ret == 0){
printf("system成功\n");
}else{
printf("system失敗\n");
}
return 0;
}
----------------------

呼び出される側(c:\\test.exeに相当)
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
inti;
for (i = 0; i < argc; i++){
p...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング