###前提・実現したいこと
pmb画像を読んで、人が閾値を決め、ソーベルでエッジ検出します。
(例)visual studio 2008でopencvのc++を作っています。
実装中に以下のエラーメッセージが発生しました。
###発生している問題・エラーメッセージ
デバッグするとエラーメッセージがなく、画像のウィンドウが出ましたが、処理できずに止まりました。
###該当のソースコード
// kadai6-2.2.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//
#include "stdafx.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
IplImage *img;//, *img_out;,img
int width,height;
int edge_thresh_sobel = 0; // 閾値の初期値
IplImage *gray_sobel, *edge_sobel, *edgeX, *edgeY;
int sobel(int t) {
int i, j, dx, dy, W, H;
double mag;
W = img->width; H = img->height; for(i=0;i<(W*H);i++) { j = i * 2; dx = (int)edgeX->imageData[j]; dy = (int)edgeY->imageData[j]; mag = (double)(dx*dx + dy*dy); mag = sqrt(mag); if(mag >= (double)t) edge_sobel->imageData[i] = (unsigned char)255; else edge_sobel->imageData[i] = 0; return t; }
}
int _tmain(int argc, _TCHAR* argv[])
{
img = 0; // 画像ファイル読み込み
img = cvLoadImage( "airplane-gray.bmp");
// 画像表示窓の準備 cvNamedWindow("入力画像", 1); // 画像表示 cvShowImage("入力画像", img); //平滑化処理 cvSmooth(img,img,CV_GAUSSIAN,3); // 画像表示窓の準備 cvNamedWindow("平滑化", 1); // 画像表示 cvShowImage("平滑化", img); // エッジ点画像用データを作成 edge_sobel = cvCreateImage( cvSize(img->width,img->height), IPL_DEPTH_8U, 1 ); // X方向,Y方向のエッジ強度を保存するバッファを確保する. // バッファのDEPTHはsigned short(IPL_DEPTH_16S)を指定する. // (画素値が[0,255]の濃淡画像から3x3のマスクでエッジを検出すると // エッジ強度は[-4*255,4*255]の値をとるため) edgeX = cvCreateImage( cvSize(img->width,img->height), IPL_DEPTH_16S, 1 ); edgeY = cvCreateImage( cvSize(img->width,img->height), IPL_DEPTH_16S, 1 ); printf("閾値を入れてください:"); scanf("%d",edge_thresh_sobel); // エッジ強度処理 sobel(edge_thresh_sobel); //画像表示窓の準備 cvNamedWindow("sobel", 1); // 結果を表示 cvShowImage("sobel",edge_sobel); // 終了処理 cvWaitKey(0); cvReleaseImage(&gray_sobel); cvReleaseImage(&edgeX); cvReleaseImage(&edgeY); cvReleaseImage(&edge_sobel); cvDestroyWindow("入力画像"); cvDestroyWindow("平滑化"); cvDestroyWindow("sobel"); return 0;
}
###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報
/---------------------------------------------------------------------------------------/
// kadai6-2.2.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//
#include "stdafx.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
IplImage *img;//, *img_out;,img
int width,height;
//int edge_thresh_sobel = 0; // 閾値の初期値
IplImage *gray_sobel, *edge_sobel, *edgeX, *edgeY;
int sobel(int t) {
int i, j, dx, dy, W, H;
double mag;
//t=edge_thresh_sobel;
W = img->width; H = img->height;
for(i=0;i<(WH);i++) {
j = i * 2;
dx = (int)edgeX->imageData[j];
dy = (int)edgeY->imageData[j];
mag = (double)(dxdx + dy*dy);
mag = sqrt(mag);
if(mag >= (double)t) edge_sobel->imageData[i] = (unsigned char)255; else edge_sobel->imageData[i] = 0; return t; }
}
int _tmain(int argc, _TCHAR* argv[])
{
img = 0; // 画像ファイル読み込み
img = cvLoadImage( "airplane-gray.bmp");
// 画像表示窓の準備 cvNamedWindow("入力画像", 1); // 画像表示 cvShowImage("入力画像", img);
printf("1");
//平滑化処理 cvSmooth(img,img,CV_GAUSSIAN,3); // 画像表示窓の準備 cvNamedWindow("平滑化", 1); // 画像表示 cvShowImage("平滑化", img); printf("2"); // エッジ点画像用データを作成 edge_sobel = cvCreateImage( cvSize(img->width,img->height), IPL_DEPTH_8U, 1 ); // X方向,Y方向のエッジ強度を保存するバッファを確保する. // バッファのDEPTHはsigned short(IPL_DEPTH_16S)を指定する. // (画素値が[0,255]の濃淡画像から3x3のマスクでエッジを検出すると // エッジ強度は[-4*255,4*255]の値をとるため) printf("3"); edgeX = cvCreateImage( cvSize(img->width,img->height), IPL_DEPTH_16S, 1 ); edgeY = cvCreateImage( cvSize(img->width,img->height), IPL_DEPTH_16S, 1 );
printf("4");
sobel(200); //呼び出し
//画像表示窓の準備
cvNamedWindow("sobel", 1);
printf("7");
// 結果を表示
cvShowImage("sobel",edge_sobel);
printf("8");
// 終了処理 cvWaitKey(0); cvReleaseImage(&gray_sobel); cvReleaseImage(&edgeX); cvReleaseImage(&edgeY); cvReleaseImage(&edge_sobel); cvDestroyWindow("入力画像"); cvDestroyWindow("平滑化"); cvDestroyWindow("sobel"); printf("9"); return 0;
}
/-----------------------------------------------------------------------------------/
またこういうように単純に閾値を代入すると、ソーベルオペレータが使えない。。。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。