解決済みの質問
わかった。
>CV_32FC1
ではなく
CV_64FC1
ではなかろうか。
CV_32FC1はfloat用。
投稿日時 - 2010-07-30 12:38:35
お礼
うまくいきました!
お手数かけて申し訳ありませんでした。
2日間ほど悩んでいたことがbluecampusさんのお陰でやっとスッキリしました。
本当にどうもありがとうございました!
投稿日時 - 2010-07-30 14:31:06
3人が「このQ&Aが役に立った」と投票しています
ベストアンサー以外の回答(4件中 1~4件目)
type ? The type of the matrix elements in the form CV_, where S=signed, U=unsigned, F=float. For example, CV_8UC1 means the elements are 8-bit unsigned and the there is 1 channel, and CV_32SC2 means the elements are 32-bit signed and there are 2 channels.
数字はビット数なのでそうですね
32FC1 = 32ビット浮動少数1チャンネル
投稿日時 - 2010-07-30 13:04:45
お礼
素早い回答と助言をありがとうございます。
とても勉強になりました!
投稿日時 - 2010-07-30 14:34:30
どうも内部的には単なるポインタをアクセスするだけのような作りっぽいので、
std::vectorは向いていない気がしてきました。
(&data[0]がずっと固定とは限らないから)
ちなみに
int main(void){
int rows = 3;
int cols = 4;
int i;
double num;
CvMat Ma;
double* data = new double[rows*cols];
for( i = 0; i < rows*cols; ++i )
{
data[i] = (double)i;
}
cvInitMatHeader(&Ma, rows, cols, CV_32FC1, &data[0], CV_AUTOSTEP);
num=cvmGet(&Ma,0,3);
printf("%f\n",num);
delete[] data;
return 0;
}
だとどうなりますか?
投稿日時 - 2010-07-30 11:01:25
補足
度々ありがとうございます。
上記のプログラムを実行してみても同じ1.875という結果になってしまいました。
http://d.hatena.ne.jp/aidiary/20100227/1267277731のページの中段(掲載されているうちの4つ目)に
書いてあるプログラムの末尾を見ると同じようなことをしているように見えるのですが、
どこがいけないのかよくわかりませんでした。
もう少し調べて検討してみます。わざわざ時間を割いてもらって申し訳ありませんでした。
本当にありがとうございます。
投稿日時 - 2010-07-30 11:59:00
とりあえず、
>heap = (int *)malloc(sizeof(int) * 10);
で
>for (i = 0;i < 12;i++) {
はサイズが違うのでまずいのでは?
それと
>CV_32FC1
はint型用のtypeではないのでは?CV_32SC1かな?
C言語といわれていますが、CvMat というクラスを使われているのでC++ですので、
STLのvectorあたりを使ってみるとか。
#include <vector>
int rows = 3;
int cols = 4;
std::vector<int> data;
for (int i = 0; i < rows * cols; ++i) {
data.push_back(i);
}
cvInitMatHeader(&Ma, rows, cols, CV_32SC1, &data[0], CV_AUTOSTEP);
投稿日時 - 2010-07-30 09:05:42
補足
お返事ありがとうございます。
サイズとタイプについては試行錯誤してたので質問に載せる際に変な感じになっちゃっていましたが、
自分で試した時はサイズ・タイプともご指摘されたように設定し実行しています。すみません。
まだプログラミングを始めたばかりなのでSTLというものが利用出来ることを知りませんでした!
ありがとうございます。そこで試しに以下のプログラムを動かしてみました。
int main(void){
int rows = 3;
int cols = 4;
int i;
double num;
CvMat Ma;
std::vector<double> data;
for( i = 0; i < rows*cols; ++i )
{
data.push_back( i );
}
cvInitMatHeader(&Ma, rows, cols, CV_32FC1, &data[0], CV_AUTOSTEP);
num=cvmGet(&Ma,0,3);
printf("%f\n",num);
return 0;
}
ちゃんと行列Maに値が格納されているか確認しようとcvmGetを使用してみました。
上のプログラムですと本来4.0という値が出力されると思うのですが、結果は1.875となってしまいます。
別の要素で試してみても思うような値が返ってきません。
data[i]に関しては、ちゃんと0~11の値が入っていることは確認したので、cvmGetを使用する際に
何か注意すべき点があるのでしょうか?もしくはcvInitMatHeaderがちゃんと機能していないのでしょうか?
またまた質問でお返しする形になって申し訳ないです。
投稿日時 - 2010-07-30 10:13:38
コンパイラによっては配列作れますよ
お使いのコンパイラは何でしょう?
一般的にはmallocで領域確保して配列のようにして使うですかね
int* array = (int*)malloc(num * sizeof(int));
array[num - 1] = 100;
.
.
.
.
free(array);
投稿日時 - 2010-07-30 07:19:12
補足
早速の回答ありがとうございます。
現在Visual C++ 2008を使用しております。
php504さんの提案されている動的確保も検討してみたんですが、
今私がやろうとしている事が1次元配列をOpenCVの関数を用いて行列とする。ということでして、
これを実行するとなるとうまくいかなくて質問した次第です。説明不足ですみませんでした。
例として、以下のプログラムを記載します。
int *heap;
CvMat Ma;
heap = (int *)malloc(sizeof(int) * 10);
if (heap == NULL) exit(0);
for (i = 0;i < 12;i++) {
heap[i] = i;
}
cvInitMatHeader( &Ma, 3, 4,CV_32FC1, heap ,CV_AUTOSTEP);
これはあくまで例なのですが、この場合Maの要素を出力してみるとすべての要素が0となってしまいます。
heap[i]に当たる部分を以下のようにした場合はちゃんと行列に要素の値が格納されていたのでどうしたものかと困っていました。
int a[] = { 1, 2, 3, 4,
5, 6, 7, 8,
9, 10, 11, 12 };
これには何か解決法があるのでしょうか?質問ばかりですみません。
投稿日時 - 2010-07-30 08:08:11