srcタイプとdstタイプ
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 2,719
opencvでプログラムを書いて実行してみると、以下のエラーがでます。
- Assertion failed(src.type() == dst.type()) in cvResize
以下のプログラムのdstの表示に問題があるのかなと考えているのですが、
解決方法を教えていただけたらと思います。
動作環境は、opencv2.4.9です。
よろしくお願いします。
int main( int argc , char** argv)
{
int counter = 0;
char str[64];
#define LINE_THICKNESS 1
#define LINE_TYPE 8
#define SHIFT 0
#define SCALE_X 0.2
#define SCALE_Y 0.2
#define SCALE_XX 5.0
#define SCALE_YY 5.0
IplImage * temp_up = NULL;
IplImage * temp_side = NULL;
IplImage * dst1 = NULL;
IplImage * dst2 = NULL;
IplImage * img = NULL;
IplImage * scale_img = NULL;
IplImage * copy_img1 = NULL;
IplImage * copy_img2 = NULL;
IplImage * grey_img1 = NULL;
IplImage * grey_img2 = NULL;
IplImage * grey_temp_up = NULL;
IplImage * grey_temp_side = NULL;
FILE *file;
file=fopen("result.csv","w");
double max_inter1inkage=0;
double min_inter1inkage=0;
double max_inter2inkage=0;
double min_inter2inkage=0;
CvPoint max_point1;
CvPoint min_point1;
CvPoint max_point2;
CvPoint min_point2;
//---------テンプレート画像を読み込む-------
temp_up=cvLoadImage("temp_up.png",CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); //カラー読み込み
temp_side=cvLoadImage("temp_side.png",CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); //カラー読み込み
grey_temp_up=cvCreateImage(cvGetSize(temp_up),IPL_DEPTH_8U,1); //1チャンネル8ビットのIplImage作成(元画像)
grey_temp_side=cvCreateImage(cvGetSize(temp_side),IPL_DEPTH_8U,1); //1チャンネル8ビットのIplImage作成(元画像)
cvCvtColor(temp_up,grey_temp_up,CV_BGR2GRAY);
cvCvtColor(temp_side,grey_temp_side,CV_BGR2GRAY);
//for ( int number =83; number<202;++number)
{
int64 start = cv::getTickCount();//所要時間計測
//------------------------原画像読み込み-------------------------------
IplImage * img= cvLoadImage("C:\\opencv_ICImage\\2016-11-8黒ネジ10本40fps\\Image0105.bmp",CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);
//--------------------------------------------------------------------------
//変換画像用IplImage
scale_img=cvCreateImage(cvSize((int)(img->width*SCALE_X), (int)(img->height*SCALE_Y)), IPL_DEPTH_8U, 3);
//変換
cvResize(img, scale_img, CV_INTER_LINEAR);
//原画像コピー
copy_img1=cvCloneImage(scale_img);
copy_img2=cvCloneImage(scale_img);
//赤枠で囲む
cvRectangle(scale_img,cvPoint(100,65),cvPoint(155,135),CV_RGB(255,0,0),LINE_THICKNESS,LINE_TYPE,SHIFT);
cvRectangle(scale_img,cvPoint(185,70),cvPoint(240,135),CV_RGB(255,0,0),LINE_THICKNESS,LINE_TYPE,SHIFT);//左上、右下
//-----------------ROIの設定----------------------
CvRect rect1;
rect1.x = 100;
rect1.y = 65;
rect1.width = 55;
rect1.height = 70;
cvSetImageROI(copy_img1,rect1);
CvRect rect2;
rect2.x = 185;
rect2.y = 70;
rect2.width = 55;
rect2.height =65;
cvSetImageROI(copy_img2,rect2);//左上、幅、高さ
//----------------------------------------------------
//入力画像表示
cvNamedWindow("img_window",CV_WINDOW_AUTOSIZE);
cvShowImage("img_window",scale_img);
//--------------------------グレースケールの場合----------------------------------------------------------------
//テンプレート・マッチングに用いる相関値データを格納する画像の領域確保
//グレー・スケール画像用に領域確保
grey_img1=cvCreateImage(cvGetSize(copy_img1),IPL_DEPTH_8U,1); //1チャンネル8ビットのIplImage作成(元画像)
grey_img2=cvCreateImage(cvGetSize(copy_img2),IPL_DEPTH_8U,1); //1チャンネル8ビットのIplImage作成(元画像)
dst1=cvCreateImage(cvSize(abs(grey_img1->width-grey_temp_up->width)+1,abs(grey_img1->height-grey_temp_up->height)+1),IPL_DEPTH_32F,1); //領域確保
dst2=cvCreateImage(cvSize(abs(grey_img2->width-grey_temp_side->width)+1,abs(grey_img2->height-grey_temp_side->height)+1),IPL_DEPTH_32F,1); //領域確保
//グレー・スケールに変換して格納
cvCvtColor(copy_img1,grey_img1,CV_BGR2GRAY);
cvCvtColor(copy_img2,grey_img2,CV_BGR2GRAY);
cvMatchTemplate(grey_img1,grey_temp_up,dst1,CV_TM_CCOEFF_NORMED); //テンプレートマッチング
cvMatchTemplate(grey_img2,grey_temp_side,dst2,CV_TM_CCOEFF_NORMED); //テンプレートマッチング
IplImage *dst3=cvCloneImage(dst1);
IplImage *dst=cvCreateImage(cvSize((int)(dst3->width*SCALE_XX), (int)(dst3->height*SCALE_YY)), IPL_DEPTH_8U, 3);
cvResize(dst3, dst, CV_INTER_LINEAR);
cvNamedWindow("dst_window",CV_WINDOW_AUTOSIZE);
cvShowImage("dst_window",dst);
//-------------------------------------------------------------------------------------------------------------
//-----------マッチング点を求める---------
cvMinMaxLoc(dst1,&min_inter1inkage,&max_inter1inkage,&min_point1,&max_point1,NULL);
cvMinMaxLoc(dst2,&min_inter2inkage,&max_inter2inkage,&min_point2,&max_point2,NULL);
//------マッチングを表示する-----
//相関値0.75以下ならばLostを表示して次に行く
//if(max_inter1inkage>0.01&& max_inter2inkage>0.01)
{
//マッチング箇所を四角で描画
cvRectangle(scale_img,cvPoint(max_point1.x+rect1.x,max_point1.y+rect1.y),cvPoint(max_point1.x+rect1.x+temp_up->width,max_point1.y+rect1.y+temp_up->height),CV_RGB(255,0,0),3);
cvRectangle(scale_img,cvPoint(max_point2.x+rect2.x,max_point2.y+rect2.y),cvPoint(max_point2.x+rect2.x+temp_side->width,max_point2.y+rect2.y+temp_side->height),CV_RGB(0,255,255),3);
//画像を表示
cvNamedWindow("result",CV_WINDOW_AUTOSIZE);
cvShowImage("result",scale_img);
//類似度表示
printf("up_Detection %lf\n",max_inter1inkage);
printf("side_Detection %lf\n",max_inter2inkage);
}
//タイマー終了
int64 end = cv::getTickCount();
double elapsedMsec = ( end - start )*1000/cv::getTickFrequency();
//タイマー表示
std::cout << elapsedMsec <<"ms" <<std::endl;
printf("\n");
cvWaitKey(0);
fprintf(file,"%f,%f,%f\n",max_inter1inkage,max_inter2inkage,elapsedMsec);
//メモリ解放
cvReleaseImage(&img);
cvReleaseImage(&scale_img);
cvReleaseImage(©_img1);
cvReleaseImage(©_img2);
cvReleaseImage(&grey_img1);
cvReleaseImage(&grey_img2);
cvReleaseImage(&dst1);
cvReleaseImage(&dst2);
cvDestroyWindow("result");
}
fclose(file);
//メモリ解放
cvReleaseImage(&temp_up);
cvReleaseImage(&temp_side);
cvReleaseImage(&grey_temp_up);
cvReleaseImage(&grey_temp_side);
//メモリ開放
cvDestroyWindow("img_window");
//cvDestroyWindow("copy_img1_window");
//cvDestroyWindow("copy_img2_window");
//cvDestroyWindow("temp_up_window");
//cvDestroyWindow("temp_side_window");
//cvDestroyWindow("grey_temp_up_window");
//cvDestroyWindow("grey_temp_side_window");
//cvDestroyWindow("grey_img1_window");
//cvDestroyWindow("grey_img2_window");
return 0;
}
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
'dst1=cvCreateImage(cvSize(abs(grey_img1->width-grey_temp_up->width)+1,abs(grey_img1->height-grey_temp_up->height)+1),IPL_DEPTH_32F,1); //領域確保'と'IplImage *dst=cvCreateImage(cvSize((int)(dst3->width*SCALE_XX), (int)(dst3->height*SCALE_YY)), IPL_DEPTH_8U, 3);'でIPL_DEPTH_32F
とIPL_DEPTH_8U
で異なってるからでは?
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.32%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2016/11/14 12:29
2016/11/14 12:30
2016/11/14 12:39