
画像の中にある粒子の位置を検出し、座標の値の取得をどうしてもOpenCVをつかって、出したいと考えております。
プログラミングが実行したら、すべて0と表示されたり、エラーが出たりします。
現在、画像を読み込み、2値化し、2値化した画像の画素数を列ごとに足して、垂直方向の画素数の最大値の検出、2値化した画像の画素数を行ごとに足して、水平方向の画素数の最大値の検出を行っています。
使用した画像を添付させていただきますので、もしアドバイスなどいただけたらよろしくお願い致します。
#include <stdio.h>
#include <math.h>
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
#define X 640
#define Y 480
IplImage *grayImage;//グレースケール画像用IplImage
IplImage *binaryImage;//2値画像用IplImage
char windowNameBinarization[] = "Binarization";//2値化した画像を表示するウィンドウの名前
int levels = 115;//トラックバーの値(2値化の際の閾値)
static int h[X][Y];
int main( /*int argc, char **argv*/ ){
//画像を読み込む
IplImage *sourceImage = cvLoadImage( "C:/Documents and Settings/Owner/My Documents/My Pictures/Logicool Webcam/Picture 10.jpg",CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);
if ( sourceImage == NULL ) {
//画像が見つからなかった場合
printf( "画像が見つかりません\n" );
return -1;
}
//画像を生成する
IplImage *grayImage = cvCreateImage( cvGetSize(sourceImage), IPL_DEPTH_8U, 1 );//グレースケール画像用IplImage
IplImage *binaryImage = cvCreateImage( cvGetSize(sourceImage), IPL_DEPTH_8U, 1 );//2値画像用IplImage
//BGRからグレースケールに変換する
cvCvtColor( sourceImage, grayImage, CV_BGR2GRAY );
//グレースケールから2値に変換する
cvThreshold( grayImage, binaryImage, levels, 255, CV_THRESH_BINARY );
/*グラフ値の取得*/
IplImage *img;
img = cvCloneImage (binaryImage); //画像をコピー
int bytes_per_pixel = ((img->depth & 255) / 8) * img->nChannels;
// (1)画素値を順次取得
int i,j,k,t;
int Hy[Y],Hx[X]; //宣言
//垂直方向の画素値
for(k = 0; k <Y /*img->height*/; k++)
{
Hy[k] = 0;//初期化
}
if((unsigned char)img->imageData>levels){
for(j = 0;j < Y/*img->height*/; j++)
{
for(i = 0; i < X; i++)
{Hy[j] += *(img->imageData + (img->widthStep*j) + (i*bytes_per_pixel));
}
}}
//水平方向の画素値
for(t = 0; t < X/*img->width*/; t++)
{
Hx[t]=0; //初期化
}
if((unsigned char)img->imageData>levels){
for(i = 0;i < X/*img->width*/; i++)
{
for(j = 0;j < Y; j++)
{
Hx[i] = Hx[i]+h[i][j];
}
}}
//Hy[j]の最大値の座標を調べる
int MY = Hy[0];
int my = 0;
for(int j=0; j< Y-1; j++){
if(Hy[j]<Hy[j+1]){
MY = Hy[j+1];
my = j+1;
}
}
//Hx[i]の最大値の座標を調べる
int MX = Hx[0];
int mx = 0;
for(int i=0; i< X-1; i++){
if(Hx[i]<Hx[i+1]){
MX = Hx[i+1];
mx = i+1;
}
}
printf("垂直方向の最大値 %d , 垂直方向の最大値になるときのy軸の値 %d \n", MY,my);
printf("水平方向の最大値 %d , 水平方向の最大値になるときのx軸の値 %d \n", MX,mx);
int cvWaitKey(int delay=10); //どこでとめるかをあらわす
cvReleaseImage( &sourceImage );
cvReleaseImage( &grayImage );
cvReleaseImage( &binaryImage );
cvDestroyWindow( windowNameBinarization);
return 0 ;
}

A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
詳細は、前のを確認してください。
その画像の黒い部分を探したい、ということなら、
//グレースケールから2値に変換する
> cvThreshold( grayImage, binaryImage, levels, 255, CV_THRESH_BINARY );
これは、白っぽい方が255になります。黒っぽい方を255にするなら
CV_THRESH_BINARY_INV
です
あと、質問よく読み直したんですが
数を数えたいなら、画素の値を足すのではなく
if ( *(img->imageData + (img->widthStep*j) + (i*bytes_per_pixel)) > 0 ) {Hy[j] ++ ;}
と数を数えるか、計算は元のまま、
cvThreshold( grayImage, binaryImage, levels, 1, CV_THRESH_BINARY_INV);
として、二値化を0/255でなく0/1にするか、です。
あと、もう一つ
>Hx[i] = Hx[i]+h[i][j];
h[i][j]に値を入れているところがどこにもありません。
参考URL:http://oshiete1.goo.ne.jp/qa5615221.html
この回答への補足
h[i][j]のところですが、私が書きたいのは、今まで足した画素の数に次の座標の画素の数に足していくというプログラミングが書きたいのですが、指摘された箇所の書き方がどのように表現すればいいか分からなくて。分かってなさすぎて、呆れるでしょうが、もしよろしければ、教えていただけないでしょうか?
補足日時:2010/01/26 16:06すごく助かりました。周りに、opencvならびにプログラミングの詳しい方がおらず、本を頼りに、プログラミングを書いておりました。
丁寧なご指導大変助かりました。また、機会があれば宜しくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- JavaScript アップロードファイルの種類によって処理を分岐させたいのですが書き方が分からずアドバイスお願いします 4 2023/06/17 19:12
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# C言語 3 2022/11/09 13:27
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- その他(プログラミング・Web制作) pythonのグローバル変数 2 2022/11/25 18:02
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C++ bmp 透過処理
-
異なるn個の整数からr個の整数...
-
intとlongは同じ?
-
再帰処理をループ処理に変換
-
関数とビット列
-
画面に文字を表示
-
c++ TCHARで文字化け
-
ヒストグラム均等化処理プログラム
-
クリックされた地点が2点の線分...
-
再起呼び出しの回数をカウント...
-
OpenCVによる4値化について
-
ヌメロンのプログラム
-
2の補数を計算するプログラム
-
c言語プログラミングについて f...
-
Win32APIで作成したDLLをC#.NET...
-
プログラムの考え方。
-
C#メール受信から件名、本文を...
-
【C#】SQL文の中に変数を埋め込...
-
条件が多い場合
-
信頼区間の1.96や1.65ってどこ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
2の補数を計算するプログラム
-
intとlongは同じ?
-
コマンドプロンプトのウィンド...
-
再帰処理をループ処理に変換
-
C++で表を作成したいのです ...
-
再起呼び出しの回数をカウント...
-
【C#】SQL文の中に変数を埋め込...
-
C言語で%を使わない余りの出し方
-
カードシャッフルのブログラム...
-
条件が多い場合
-
C++ bmp 透過処理
-
C言語のプログラムについて(...
-
C言語で簡単なパックマンゲーム...
-
C++ Debug Errorについて教えて
-
argvのNULLチェック
-
C言語の問題
-
関数とビット列
-
C言語
-
16bitで乱数を生成する方法
-
迷路を脱出する経路探索プログ...
おすすめ情報