前提・実現したいこと
opencvでのコンパイルができません。
発生している問題・エラーメッセージ
feature.cpp:1:10: fatal error: 'opencv2/highgui/highgui.hpp' file not found #include <opencv2/highgui/highgui.hpp>
該当のソースコード
c++
1#include <opencv2/highgui/highgui.hpp> 2#include <opencv2/imgproc/imgproc.hpp> 3#include <opencv2/features2d/features2d.hpp> 4#include <opencv2/calib3d/calib3d.hpp> 5#include <opencv2/xfeatures2d/nonfree.hpp> 6#include <iostream> 7#include <time.h> 8 9using namespace cv; 10using namespace std; 11 12void bubblesort(double a[], int n){ 13 int i,j; 14 15 16 for(i = 0; i < n - 1; i++){ 17 for(j = n - 1; j > i; j--){ 18 if(a[j - 1] > a[j]){ 19 double temp = a[j]; 20 a[j] = a[j - 1]; 21 a[j - 1] = temp; 22 } 23 } 24 } 25} 26 27int main(void) 28{ 29 30 int idx[2000]; 31 int x,y,i = 0; 32 int x2,y2,i2 = 0; 33 int x3,y3,x4,y4,xx3,yy3,xx4,yy4 = 0; 34 int i5 = 0; 35 double dis,dis2,ave = 0; 36 int distance = 0; 37 int i6 = 0; 38 int epipolar1,epipolar2 = 0; 39 int focus = 330; 40 double camera = 0.005; 41 int cameradistance = 50; 42 double sort[3000]; 43 double distance2 = 0; 44 double distance3 = 0; 45 double xrange,yrange = 0; 46 47 clock_t start = clock(); 48 // 画像の読み込み 49 Mat img_src1 = imread( "r20.jpg", IMREAD_COLOR ); 50 Mat img_src2 = imread( "l20.jpg", IMREAD_COLOR ); 51 52 Mat dst,dst2; 53 54 // 画像の表示 55 imshow( "leftcamera", img_src1); 56 imshow( "rightcamera", img_src2); 57 waitKey( 0 ); 58 59 auto akaze = AKAZE::create(AKAZE::DESCRIPTOR_MLDB,0,3,0.0001f);//0.0001fの箇所でAKAZEの条件の緩和 60 61 vector<KeyPoint> keypoints1,keypoints2; 62 akaze->detect(img_src1,keypoints1); 63 akaze->detect(img_src2,keypoints2); 64 65 drawKeypoints(img_src1,keypoints1,dst); 66 drawKeypoints(img_src2,keypoints2,dst2); 67 imshow( "leftcamerakey", dst); 68 imshow( "rightcamerakey", dst2); 69 70 Mat descriptor1, descriptor2; 71 akaze->compute(img_src1, keypoints1, descriptor1); 72 akaze->compute(img_src2, keypoints2, descriptor2); 73 74 //DescriptorMatcherオブジェクトの生成 75 Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("BruteForce-Hamming");//BruteForce-Hamming 76 // 特徴点のマッチング情報を格納する変数 77 vector<DMatch> match12, match21 ,dmatch; 78 // 特徴点マッチングの実行 79 matcher->match(descriptor1, descriptor2, match12); 80 matcher->match(descriptor1, descriptor2, match21); 81 82 // 最小距離の取得 83 double min_dist = DBL_MAX;//double の最大値ß 84 85 for(int i = 0; i < (int)match12.size(); i++){ 86 double dist12 = match12[i].distance;//画像間の特徴点距離 87 double dist21 = match21[i].distance;//画像間の特徴点距離 88 int match12right_idx = match12[i].queryIdx; // match12keypoint1 のインデックス 89 int match12left_idx = match12[i].trainIdx; // match12keypoint1 のインデックス 90 int match21light_idx = match21[i].queryIdx; // match21keypoint2 のインデックス 91 int match21y_idx = match21[i].trainIdx; 92 93 94 //特徴点間の最小距離を求める 95 if(dist12 < min_dist){ 96 min_dist = dist12; 97 98 cout << "min_distancematch12" << " " << min_dist << "\n"; 99 } 100 101 // しきい値を設定する 102 const double threshold = 3.0 * min_dist; 103 cout << "threshold"<< " "<< threshold << "\n"; 104 105 for(int i = 0; i < (int)match12.size(); i++){ 106 107 //int kpp1_idx = match[i].queryIdx; // keypoint1 のインデックス 108 //int kpp2_idx = match[i].trainIdx; // keypoint2 のインデックス 109 int match12right_idx = match12[i].queryIdx; // match12keypoint1 のインデックス 110 int match12left_idx = match12[i].trainIdx; // match12keypoint2 のインデックス 111 int match21right_idx = match21[i].queryIdx; // match21keypoint1 のインデックス 112 int match21left_idx = match21[i].trainIdx; // match21keypoint2 のインデックス 113 epipolar1 = keypoints1[match12right_idx].pt.y; // 画像1の対応点座標 114 epipolar2 = keypoints2[match12left_idx].pt.y; // 画像2の対応点座標 115 116 117 DMatch forward = match12[i]; 118 DMatch backward = match21[forward.trainIdx]; 119 120 /* 121 //match12座標表示 122 cout << "match12作業前" << "keypoint1 "<< match12right_idx+1 << " x=" << x3 << " y=" << y3 << " " << "keypoint2 "<< match12right_idx+1 << " x=" << x4 << " y=" << y4 << "\n"; 123 124 //match21座標表示 125 cout << "match21作業前" << "keypoint1 "<< match21right_idx+1 << " x=" << xx3 << " y=" << yy3 << " " << "keypoint2 "<< match21left_idx+1 << " x=" << xx4 << " y=" << yy4 << "\n"; 126 */ 127 128 /*双方向マッチング 129 if(match12[i].distance < threshold && match21[i].distance < threshold && epipolar1 < epipolar2+10 && epipolar1 > epipolar2-10 && 130 backward.trainIdx == forward.queryIdx){ 131 */ 132 if(match12[i].distance < threshold && match21[i].distance < threshold && epipolar1 < epipolar2+10 && epipolar1 > epipolar2-10){ 133 idx[i] = 1; 134 dmatch.push_back(forward); 135 136 }else{ 137 idx[i] = -1; 138 139 } 140 141 } 142 143 for(int i = 0; i < (int)match12.size(); i++){ 144 int match12right_idx = match12[i].queryIdx; // match12keypoint1 のインデックス 145 int match12left_idx = match12[i].trainIdx; // match12keypoint1 のインデックス 146 int match21right_idx = match21[i].queryIdx; // match21keypoint2 のインデックス 147 int match21left_idx = match21[i].trainIdx; // match21keypoint2 のインデックス 148 149 if(idx[i] == 1){ 150 151 //match12画像1の対応点座標 152 x3 = keypoints1[match12right_idx].pt.x; 153 y3 = keypoints1[match12right_idx].pt.y; 154 //match12画像2の対応点座標__ 155 x4 = keypoints2[match12left_idx].pt.x; 156 y4 = keypoints2[match12left_idx].pt.y; 157 //match21画像1の対応点座標 158 xx3 = keypoints1[match21right_idx].pt.x; 159 yy3 = keypoints1[match21right_idx].pt.y; 160 //match21画像2の対応点座標 161 xx4 = keypoints2[match21left_idx].pt.x; 162 yy4 = keypoints2[match21left_idx].pt.y; 163 164 /* 165 //特徴量の表示descriptor1 166 Mat d(descriptor1,Rect(0,kp1_idx,descriptor1.cols,1)); 167 cout << "descriptor1 " << kp1_idx+1 << ": " << d << endl; 168 //特徴量の表示descriptor2 169 Mat d2(descriptor2,Rect(0,kp2_idx,descriptor2.cols,1)); 170 cout << "descriptor2 " << kp2_idx+1 << ": " << d2 << endl; 171 */ 172 173 i5++; 174 cout << "dmatch " << i5 << ' '; 175 176 //match12座標表示 177 cout << "match12" << "keypoint1 "<< match12right_idx+1 << " x=" << x3 << " y=" << y3 << " " << "keypoint2 "<< match12right_idx+1 << " x=" << x4 << " y=" << y4 << "\n"; 178 //match21座標表示 179 cout << "match21" << "keypoint1 "<< match21right_idx+1 << " x=" << xx3 << " y=" << yy3 << " " << "keypoint2 "<< match21left_idx+1 << " x=" << xx4 << " y=" << yy4 << "\n"; 180 181 dis += (x4-x3); 182 183 xrange = (x3*cameradistance /(x4-x3)); 184 yrange = (y3*cameradistance /(x4-x3)); 185 186 //測定した距離をそれぞれ配列に入れる。 187 dis2 = ((cameradistance*focus)/(camera*(x4-x3)))/1000; 188 189 cout << xrange << ' ' << yrange << ' '<< dis2 << "\n"; 190 191 sort[i5] = dis2; 192 //cout << sort[i5] << "\n"; 193 ave = dis/i5; 194 195 } 196 197 } 198 199 //バブルソート 200 bubblesort(sort,i5); 201 cout << "並び替え後" << "\n"; 202 for(i = 1; i < i5; i++){ 203 cout << "dmatch " << i << ' '; 204 cout << sort[i] << "\n"; 205 } 206 207 for (i = i5/10; i < (i5/10)*9; i++) { 208 distance2 += sort[i]; 209 } 210 211 distance3 = distance2 / ((i5/10)*8); 212 213 cout << "x軸の特徴点座標差異の平均値は" << ave << "です\n"; 214 215 cout << "対象までの距離は" << ((cameradistance*focus)/(camera*ave))/1000 << "cmです\n"; 216 217 cout << "対象までの距離(bubblesort)は" << distance3 << "cmです\n"; 218 219 Mat dest; 220 drawMatches(img_src1, keypoints1, img_src2, keypoints2, dmatch, dest); 221 222 //白黒で描写 223 //drawMatches(img_src1, keypoints1, img_src2, keypoints2, dmatch, dest,DrawMatchesFlags::DEFAULT); 224 225 226 //DrawMatchesFlags::DEFAULT 227 228 imshow("result",dest); 229 waitKey( 0 ); 230 231 clock_t end = clock(); 232 const double time = static_cast<double>(end - start) / CLOCKS_PER_SEC * 1000.0; 233 printf("time %lf[ms]\n", time); 234 return 0; 235} 236
試したこと
コンパイルは以下で行いました
c++ -o feature feature.cpp pkg-config --libs --cflags opencv4
-std=c++17
highgui.hppのファイル位置を確認したところ
usr/local/Celler/opencv/4.5.0_5/include/opencv4/opencv2にあります
補足情報(FW/ツールのバージョンなど)
opencv のバージョンは4.5.0になります。
Mac osはCatalina10.15.7
補足情報(higuchi.hpp)
c++ -o feature feature.cpp `pkg-config --libs --cflags opencv4` -std=c++17
でビルドできましたけど…。{ } の対応がおかしくてエラーになりますが。
ちなみに、pkg-config --libs --cflags opencv4 だけ実行すると何か表示されますか?
$ pkg-config --libs --cflags opencv4
-I/usr/local/Cellar/opencv/4.5.0_3/include/opencv4 -L/usr/local/Cellar/opencv/4.5.0_3/lib -lopencv_gapi -lopencv_stitching -lopencv_alphamat -lopencv_aruco -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_dnn_objdetect -lopencv_dnn_superres -lopencv_dpm -lopencv_highgui -lopencv_face -lopencv_freetype -lopencv_fuzzy -lopencv_hfs -lopencv_img_hash -lopencv_intensity_transform -lopencv_line_descriptor -lopencv_mcc -lopencv_quality -lopencv_rapid -lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_sfm -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_superres -lopencv_optflow -lopencv_surface_matching -lopencv_tracking -lopencv_datasets -lopencv_text -lopencv_dnn -lopencv_plot -lopencv_videostab -lopencv_videoio -lopencv_viz -lopencv_xfeatures2d -lopencv_shape -lopencv_ml -lopencv_ximgproc -lopencv_video -lopencv_xobjdetect -lopencv_objdetect -lopencv_calib3d -lopencv_imgcodecs -lopencv_features2d -lopencv_flann -lopencv_xphoto -lopencv_photo -lopencv_imgproc -lopencv_core
このように表示されます
なるほど、pkg-config は正しく動いてますね。コンパイルの際に、c++ -o feature feature.cpp `pkg-config --libs --cflags opencv4` -std=c++17 のように pkg-config コマンドを `` (バッククオート) で括って実行していると思いますが、これは pkg-config の結果を c++ コマンドの引数として埋め込むという意味 (https://uxmilk.jp/27649) なので、それで行けるはずですが…。
はい現在も
c++ -o feature feature.cpp `pkg-config --libs --cflags opencv4` -std=c++17
にてコンパイルを行っているのですがファイルの探索ができない状態です
>highgui.hppのファイル位置を確認したところ
>usr/local/Celler/opencv/4.5.0_5/include/opencv4/opencv2にあります
pkg-config --libs --cflags opencv4の結果は
/usr/local/Cellar/opencv/4.5.0_3/include/opencv4/opencv2のようですが、
/usr/local/Cellar/opencv/4.5.0_5から/usr/local/Cellar/opencv/4.5.0_3にシンボリックリンクでもはってあるのでしょうか。
ないならバージョンアップでopencv.pc ファイルが更新されていない?
おそらく/usr/local/Cellar/opencv/4.5.0_5/lib/pkgconfigにあるであろうopencv.pcを/usr/local/lib/pkgconfig/にコピーしてみてください。
opencvのアップデートを行なったのでそれが原因かも知れないです
ちなみにhighgui.hppの位置は
usr/local/Celler/opencv/4.5.0_5/include/opencv4/opencv2/highgui
usr/local/Celler/opencv/4.5.0_5/include/opencv4/opencv2
の二箇所にあります。
現在/usr/local/Celler/opencv/4.5.0_3/include/opencv4/opencv2の位置にあるファイルは消去しているはずです。
.pcファイルはusr/local/Celler/opencv/4.5.0_5/lib/pkgconfigに
opencv 4.pcがあります...
opencv はどうやってインストール・アップデートしましたか?
(/usr/local/Celler ってことは brew をお使いかと思いますが、その場合 /usr/local を直接いじるのはよくないです。)
brew install opencv にてインストールを行いました
/usr/local/lib/pkgconfig内にもopencv4.pcファイルはあります。
sanrinshunnari-no-MacBook-Pro:opencv sss$ pwd
/usr/local/Cellar/opencv
sanrinshunnari-no-MacBook-Pro:opencv sss$ ls
4.5.0_5
のみのファイルがあります
>.pcファイルはusr/local/Celler/opencv/4.5.0_5/lib/pkgconfigにopencv 4.pcがあります...
そのファイルを/usr/local/lib/pkgconfigに上書きしてみてください
うーん、brew で opencv をアップデートしたら pkg-config の情報も更新されるはずですが…。
which pkg-config というコマンドを実行して、pkg-config の場所を確認してもらえますか?
http://blueeyes.sakura.ne.jp/2020/02/15/2906/
>SHOMIさん
コピーを行なってみます
>hoshi-takanoriさん
/usr/local/bin/pkg-config
の位置が出力されました
pkg-config --libs --cflags opencv4の結果は
-I/usr/local/Cellar/opencv/4.5.0_5/include/opencv4 -L/usr/local/Cellar/opencv/4.5.0_5/lib -lopencv_gapi -lopencv_stitching -lopencv_alphamat -lopencv_aruco -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_dnn_objdetect -lopencv_dnn_superres -lopencv_dpm -lopencv_highgui -lopencv_face -lopencv_freetype -lopencv_fuzzy -lopencv_hfs -lopencv_img_hash -lopencv_intensity_transform -lopencv_line_descriptor -lopencv_mcc -lopencv_quality -lopencv_rapid -lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_sfm -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_superres -lopencv_optflow -lopencv_surface_matching -lopencv_tracking -lopencv_datasets -lopencv_text -lopencv_dnn -lopencv_plot -lopencv_videostab -lopencv_videoio -lopencv_viz -lopencv_xfeatures2d -lopencv_shape -lopencv_ml -lopencv_ximgproc -lopencv_video -lopencv_xobjdetect -lopencv_objdetect -lopencv_calib3d -lopencv_imgcodecs -lopencv_features2d -lopencv_flann -lopencv_xphoto -lopencv_photo -lopencv_imgproc -lopencv_core
に変わりました
正しくパスが指定されたようなのでこれで再度コンパイルするとどうなりますか。
下の方の指摘のようにフルパスでのコンパイルでも、今まで通りのものでもfile not foundとなります。
ここまでわからないとなるとopencvの再インストールも検討に入れた方がよろしいでしょうか??
フルパスでのコンパイルと言っている方はパス指定が間違っているようですが…
回答2件
あなたの回答
tips
プレビュー