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

opencvに関する質問です。
64×64画像の画素値をMat行列に格納し、
その行列をvectorに変換するプログラムなのですが、
その変換の部分でうまくいきません。原因はなんでしょうか。

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


#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include<stdio.h>
#include<iostream>
#include<fstream>
#include<vector>
#include <stdlib.h>
using namespace cv;
using namespace std;

int main(int argc, char *)
{
vector <float> v1;
Mat A = imread( "分割1-1\0015.bmp",);//Aに画像を読み込み
A= A.reshape(0,1);//Aを1行の行列へ変換
A.copyTo(v1);//Aをベクトルv1に変換
waitKey(0);
return 0;
}

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

A 回答 (4件)

atメソッドを使ったり、ptrメソッドを使ったりします。


http://opencv.jp/opencv2-x-samples/access_pixel_ …
の C++版 。これは、各画素の書き込むものですが、= の左右を逆に考えれば、各画素の値を読み出すのに使えます。



追記:
調べたところ、 cv::Mat::copyToで、std::vectorにコピーすること自体はできるようです。
http://book.mynavi.jp/support/pc/opencv2/c3/open …
ただ、その場合、Matの型、チェンネルとvectorの型を揃える必要があるように思います。
また、OpenCVのバージョンによっては、 型を指定する必要があります。

それで気になっているんですが、
おそらく、 〜.bmpは、 8bit x 3チャンネル(3色) です。
それに対して、 v1は <float> となっています。
v1には、どんなデータを入れたいとお考えなのでしょうか?

事前に型や色を変換するとか、vectorを適切な型にするとかが必要と思われます。
# 今OpenCVを使える環境が無いので、当方で確認することはできません
    • good
    • 0
この回答へのお礼

ありがとうございます。
v1には、bmpの画素値が入ったMatをコピーしたいと考えています。
ちなみに、bmpは64×64のグレー画像です。
この画像の画素値をまずMatに格納し、それをv1にコピーしたいと考えています。
型についての知識がないため、迷惑をかけるかもしれませんが、
よろしくお願いいたします。

お礼日時:2015/12/05 23:32

エラーメッセージ読んでもわかりませんか?



#1のコードは
vector< vector > &dst

あなたのコードは
vector <float> v1


難しいようなら、まとめてやろうとは思わず、
Aから1個選択→ v1にpush_back を全データについて繰り返す
って、単純なプログラムにしてはどうです?
    • good
    • 0
この回答へのお礼

ありがとうございます。
そのプログラムを作成してみます。
Aから1個選択とは、どのような操作でしょうか?

お礼日時:2015/12/05 11:21

https://oshiete.goo.ne.jp/qa/9124133.html
の繰り返しになりますけど、
** 「うまくいかない」とは、具体的にどんな現象から判断していますか? **

そもそも、コンパイル自体が成功しない。
画像の読み込み が「うまくいかない」
画像は読み込めたけど、 1行の行列へ変換が「うまくいかない」
画像は読み込めたし、1列の行列の変換するのもできたけど、 vectorに変換するのが「うまくいかない」


それぞれで対策が違います。
正常動作している部分がわからなければ、せっかく正しいのに逆に間違えてしまうこともあります。




Mat A = imread( "分割1-1\0015.bmp",)
 ・目に見えておかしいのが文字列リテラル(文字列の定数)
  \ が特別扱いになるのはご存知ですよね?
 ・"のあとの . ) って、文法エラーになりませんか? カンマだけで引数省略、なんて書き方、C++ではできないはずです。
 ・ファイルを正しく読めていることを確認してください。
  ファイル操作は失敗が多いです(USBディスクを指定したけど抜いた後だった、とか)
http://opencv.jp/opencv-2svn/cpp/reading_and_wri …


A= A.reshape(0,1);//Aを1行の行列へ変換
 マニュアルによると「チャンネル(カラーとかグレースケールとか) を変えずに1行に変形」 ということになりますが、それで正しいですか?

A.copyTo(v1);//Aをベクトルv1に変換
 マニュアルを読む限りでは、 cv::Matからcv::Matへコピーするもので、 std::vectorにコピーするようには見えないのですが。
 別のバージョンではstd::vectorへコピーするようになったのでしょうか?
 http://opencv.jp/opencv-2svn/cpp/core_basic_stru …
    • good
    • 0
この回答へのお礼

ありがとうございます。やってみたところ、for文の中でエラーが起きるのですが、どんな原因なんでしょうか。

vector <float>v1;
Mat A = imread(”分割1-1\¥0015.bmp”);//Aに画像を読み込み
A= A.reshape(0,1);//Aを1行の行列へ変換


for (int i = 0; i&lt; image.rows; i++)
{
v1.push_back(image.row(i));//ここでv2.push_backはできないというエラーが出ます
}

お礼日時:2015/12/05 10:48

copyToメソッドは


void Mat::copyTo(Mat& m )
なので、vectorに変換することができません。

vectorに変換するためには以下のように逐次追加する必要があります(URL先から引用)
void MatToVec(const Mat &src, vector< vector > &dst){
for(int i = 0; i< src.rows; i++ ){
dst.push_back(src.row(i));
}}

引用元
http://utunes.blog.fc2.com/blog-entry-10.html
    • good
    • 0
この回答へのお礼

ありがとうございます。やってみたところ、for文の中でエラーが起きるのですが、どんな原因なんでしょうか。

vector <float> v1;
Mat A = imread( "分割1-1\¥0015.bmp");//Aに画像を読み込み
A= A.reshape(0,1);//Aを1行の行列へ変換


for (int i = 0; i< image.rows; i++)
{
v2.push_back(image.row(i));//ここでv2.push_backはできないというエラーが出ます
}

お礼日時:2015/12/05 10:46

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

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

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

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

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

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) {
// ここに処理を書く
}
という関数が必要なようです。

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ファイルやディレクトリの存在確認を行う方法

ファイルをオープンするのはfopenでOKですが、ファイルやディレクトリの存在確認を行う方法が知りたいです。

何か組み合わせて作るものなのでしょうか?
perlとか便利な演算子があるのですが、C/C++って器用ではないですね。
これは処理系?依存の内容ですか?

私の環境は VC6, VC2005 Windows2000です。

Aベストアンサー

int access(const char* path, int mode);
int stat(const char* path, struct stat* sb);

かな?
MSDN を引くと _access_s() を使えとか書いてあるけど。

Qcout と cerrの違い

こんにちわ。
どうも初歩的な質問だと思うのですが、教えてください。

C++で、cerrとcoutの違いは何なのでしょうか?
どちらも同じように出力できますし。
自分でエラー表示を出力させたいような時にcerrを使えばよいのでしょうか?

使い分ける必要がいまいち分かりません。
お暇なときにでもお願いします。

Aベストアンサー

cerr:標準エラー出力 =C言語では stderr
cout:標準出力 =C言語では stdout

どちらもコンソールへの出力ですが、違いはハンドルが違うことです。
このため、リダイレクトやパイプのやり方が変わります。
http://www-or.amp.i.kyoto-u.ac.jp/algo-eng/db/stdinout.html

この違いを利用すると、通常の出力を標準出力に出力しエラーのみエラー出力に
しておくことで、リダイレクトやパイプを利用しているときでも、エラーは
コンソールに出力されるので便利になります。

尚、Windows系では、標準エラー出力へのリダイレクトは
abc 2> route.txt
のような書式になります。(#2さんの書式はWindows系では使えません)
http://www.monyo.com/technical/windows/04.html

参考URL:http://www-or.amp.i.kyoto-u.ac.jp/algo-eng/db/stdinout.html,http://www.monyo.com/technical/windows/04.html

cerr:標準エラー出力 =C言語では stderr
cout:標準出力 =C言語では stdout

どちらもコンソールへの出力ですが、違いはハンドルが違うことです。
このため、リダイレクトやパイプのやり方が変わります。
http://www-or.amp.i.kyoto-u.ac.jp/algo-eng/db/stdinout.html

この違いを利用すると、通常の出力を標準出力に出力しエラーのみエラー出力に
しておくことで、リダイレクトやパイプを利用しているときでも、エラーは
コンソールに出力されるので便利になります。

尚、Windows系では、標...続きを読む

Qファイル出力の場所を指定

現在C++にてhtmlファイルを出力するプログラムを作っているのですが、出力場所を指定することはできるのでしょうか?(現在はそのプログラムソースが保存されている場所と同じファイル内に出力されますが、それをデスクトップに出力するなど。)
もし、方法がありましたら、教えてください。
ソースや参考HPのURLなどのせていただけたらありがたいです。
環境はVisualStudio.NET2003です。
よろしくお願いします。

Aベストアンサー

単にファイル名の前にパスを指定する。

絶対パス指定
fp=fopen("c:/temp/test.txt","w");

相対パス指定
fp=fopen("./hoge/test.txt","w");


デスクトップはOSやユーザによって場所が異なるので、少し面倒です。
XPの場合環境変数を利用してこんな感じで出来ると思います。

例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main(void)
{
FILE *fp;
char fname[1024];
strcpy(fname,getenv("USERPROFILE"));
strcat(fname,"/デスクトップ/test.txt");
fp=fopen(fname,"w");
//処理
fclose(fp);
}

QLPCWSTRとchar

質問なのです・・・

現在、私は[Visual Stdio.Net 2005]を使って、C++のプログラミングをしようと思いまして、今日参考書を見てやってみたのですが、

charの配列を使って、文字列を格納しそれを使おうとしたら、LPCWSTRのキャストが必要というエラーがでました。
参考書だと普通に通るらしいのですが・・・Visual Stdio.Net 2003と2005の違いなのでしょか?わかる方教えていただけませんでしょうか??

Aベストアンサー

補足です。
2005デフォルトのUNICODEを変更する方法は
プロジェクト->プロパティ->構成プロパティ->全般 の中にある
文字セットを[Unicode 文字セットを使用する]から[マルチバイト文字セットを使用する]
に変更することで可能です。

QSTLで、vectorのファイルへの書き出し、読み込み。

STLで、vectorのファイルへの書き出し、読み込み。

C++ の STL で vector をファイルに書き出し、読み込もうとしておりまして、まずは書き出しで躓いております。

vector<int> testvector;
for (i = 0 ; i < 10 ; i++)
testvector.push_back( i );
ofstream out("test.dat", ios::out | ios::binary);
if (!out) return 1;
out.write((vector<int>) testvector, sizeof(testvector));
out.close();

こんな感じのコードですと、

error: no matching function for call to ‘std::basic_ofstream<char, std::char_traits<char> >::write(std::vector<int, std::allocator<int> >, long unsigned int)’
/usr/include/c++/4.2.1/bits/ostream.tcc:173: note: candidates are: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::write(const _CharT*, std::streamsize) [with _CharT = char, _Traits = std::char_traits<char>]

とのことです orz. どのようにすれば vector を書き出し、そして読み込むことができるのでしょうか。情報がありましたら是非お寄せください。

STLで、vectorのファイルへの書き出し、読み込み。

C++ の STL で vector をファイルに書き出し、読み込もうとしておりまして、まずは書き出しで躓いております。

vector<int> testvector;
for (i = 0 ; i < 10 ; i++)
testvector.push_back( i );
ofstream out("test.dat", ios::out | ios::binary);
if (!out) return 1;
out.write((vector<int>) testvector, sizeof(testvector));
out.close();

こんな感じのコードですと、

error: no matching function for call to ‘std::basic_ofstream...続きを読む

Aベストアンサー

#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

int main() {
vector<int> testvector;

for (int i = 0 ; i < 10 ; i++)
testvector.push_back( (i+1)*100 );

ofstream out("test.dat", ios::out | ios::binary);
if (!out) return 1;

int count = testvector.size();
out.write(reinterpret_cast<const char*>(&count), sizeof(count));
out.write(reinterpret_cast<const char*>(&testvector[0]), testvector.size() * sizeof(int));
out.close();

testvector.clear();
count = 0;

ifstream in("test.dat", ios::in | ios::binary);
if ( !in ) return 1;
in.read(reinterpret_cast<char*>(&count), sizeof(count));
testvector.assign(count, 0);
in.read(reinterpret_cast<char*>(&testvector[0]), testvector.size() * sizeof(int));
in.close();

for ( int i = 0; i < testvector.size(); ++i )
cout << testvector[i] << endl;
}

#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

int main() {
vector<int> testvector;

for (int i = 0 ; i < 10 ; i++)
testvector.push_back( (i+1)*100 );

ofstream out("test.dat", ios::out | ios::binary);
if (!out) return 1;

int count = testvector.size();
out.write(reinterpret_cast<const char*>(&count), sizeof(count));
out.write(reinterpret_cast<const char*>(&testvector[0]), testvector.size() * sizeof(int));
out.close();...続きを読む

Q魚眼レンズの画像処理

魚眼レンズで撮影した画像って、ひずんでますよね。
これを普通に(って何が普通かと言う問題はあるけれど)直す
処理プログラムをおしえていただけませんか?

できれば、教科書的なものでなく、サンプルプログラムがあれば
うれしいんですが・・・
言語は、C以上の高級言語ならたいていわかるので
せめてポインタだけでも・・

お願いします。

Aベストアンサー

代数幾何の射影変換で多分出来ると思います
通常画像を射影変換して魚眼レンズで見たような画像に出来るので魚眼レンズの射影行列の逆行列で変換してやれば元の画像に戻るはずです

元画像をN、射影行列をA、その逆行列をA^-1とした時、
NAが魚眼レンズ画像となるので、それにA^-1をかけると
NAA^-1 = N(AA^-1)
= N1
= N
で、元画像に戻ります

サンプルプログラムは「アフィン変換」や、「射影変換」などで検索すれば出てくると思います
または3D Gameのライブラリを見ればまず載っているはずです

参考URL:http://www.microsoft.com/japan/developer/library/default.asp?URL=/japan/developer/library/jpdx6sdk/_dx_the_projection_tr

Q実行途中でのエラー発生について

こんばんは。
この掲示板を頻繁に利用させていただいている者です。

Visual C++.NET 2003を利用しソケットプログラミングをしていたところ、突然わけの分からないエラーが途中で発生してしまいます。

[エラー内容]
Debug Assertion Failed!
File: fprintf.c
Line:56

Expression: str != NULL

For information on how your program can cause an assertion failure,see the Visual C++ documentation on asserts.
(Press Retry to debug the application)
上記のようなエラー内容です。

今まで実行可能であったのに、突然エラーメッセージが発生しました。
Line:56ということから56行目を見たところ、str != NULLという記述もしていませんし、かつその行はコメントを記述しています。

なにか原因があるのでしょうか?

よろしくお願いします。

こんばんは。
この掲示板を頻繁に利用させていただいている者です。

Visual C++.NET 2003を利用しソケットプログラミングをしていたところ、突然わけの分からないエラーが途中で発生してしまいます。

[エラー内容]
Debug Assertion Failed!
File: fprintf.c
Line:56

Expression: str != NULL

For information on how your program can cause an assertion failure,see the Visual C++ documentation on asserts.
(Press Retry to debug the application)
上記のようなエラー内容です。

今ま...続きを読む

Aベストアンサー

> File: fprintf.c
> Line:56

これは、fprintf関数のソースの56行目です。
質問者さんのプログラムで、fprintf関数を呼び出ししている箇所があると思います。

VCは現在手元にありませんが、[表示]メニューから「コールスタック」ウィンドウを表示すると、どういう関数が順番に呼ばれてfprintfのところにたどり着いたかをあらわすコールスタックが表示されます。
呼び出し先(上)から遡って、自身の作成したモジュールの所での引数を確認してみてください。

Q透視投影された平面を正面から見たように変換したい

透視投影で撮影された平面を、正面から撮影したように投影変換する処理を教えてください。
または、射影ひずみの補正といわれるものでしょうか?
私なりにいろいろと調べまして、
「画像の平面内の四頂点の座標を求めることができれば、平面の傾きを求めることができる。」
というところまでたどり着きまして、平面の角度を求めるところまではいきました。
しかし、その後の行列変換がわかりません。
単に回転であれば、

1    0    0
0 cosθ -sinθ
0 sinθ cosθ


cosθ 0 sinθ
0   1    0
-sinθ 0 cosθ

をかければよいかと思っていましたが、奥行きの収縮などの関係がわかりません。
どの様な行列をかければ求めることができるのか教えてください。
このような研究をしていますが、行列は苦手なので、簡単な質問でしたらすみません。

Aベストアンサー

アフィン変換と透視投影の座標変換は以下のURLに詳しく載っていると思いますので、勉強してください。
中に座標変換の式も載っていると思います。
アフィン変換や透視投影の理解に役立つようにイメージ図のあるHPも余分にあげておきました。参考になるかと思います。

アフィン変換と透視投影
http://nis-lab.is.s.u-tokyo.ac.jp/nis/CG/cgtxt/index2.htm
http://www.geocities.co.jp/Hollywood/5174/td.html
http://www-antenna.ee.titech.ac.jp/~hira/hobby/edu/afin_trans/math_html/index.html
http://hawk.ise.chuo-u.ac.jp/makino-lab/person/itot/cg2003/cg-lecture5.pdf
http://kawanobe.rs.sanno.ac.jp/~matsunaga_y/rinkou2.pdf
http://navi.cs.kumamoto-u.ac.jp/lecture/computergrahics/2007/8.pdf

プログラムでの座標変換
http://www.saturn.dti.ne.jp/~npaka/xna/PrimitiveEx/index.html

アフィン変換と透視投影の座標変換は以下のURLに詳しく載っていると思いますので、勉強してください。
中に座標変換の式も載っていると思います。
アフィン変換や透視投影の理解に役立つようにイメージ図のあるHPも余分にあげておきました。参考になるかと思います。

アフィン変換と透視投影
http://nis-lab.is.s.u-tokyo.ac.jp/nis/CG/cgtxt/index2.htm
http://www.geocities.co.jp/Hollywood/5174/td.html
http://www-antenna.ee.titech.ac.jp/~hira/hobby/edu/afin_trans/math_html/index.html
http:/...続きを読む


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

人気Q&Aランキング