質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

AR(Augmented Reality)

AR(Augmented Reality)とは、拡張現実のことです。人が認識する現実の環境で視覚・聴覚などの知覚が感知する情報をコンピュータで拡張する技術、もしくはその環境そのものを表す言葉です。

Q&A

0回答

809閲覧

OpenCVのArucoマーカー検出プログラムでの例外スローについて

MasatoOkada

総合スコア11

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

AR(Augmented Reality)

AR(Augmented Reality)とは、拡張現実のことです。人が認識する現実の環境で視覚・聴覚などの知覚が感知する情報をコンピュータで拡張する技術、もしくはその環境そのものを表す言葉です。

0グッド

0クリップ

投稿2018/11/20 03:30

OpenCVのArucoマーカーの検出プログラムを作成しています。
4K動画の画像を25分割してそれぞれの画像に対して検出を行うという処理です。
動画の特定のフレーム(今処理している動画では429フレーム目)を処理するときに、25個の画像のうちのランダムな場所で、delete_scalar.cppのなかで、ブレークポイントが発生しましたという例外がスローされて処理が止まります。おそらく、cv::aruco::detectMarkersで例外が発生しています。
動画の処理開始位置が1フレーム目からでも、420フレーム目からでも、429フレームで例外がスローされます。
また、シングルスレッドとマルチスレッドを切り替えられるプログラムになっていますが、どちらでも同じ例外が発生します。
例外設定の”スローされたときに中断”についてはすべての項目についてチェックを外しています。
例外をなくしたり、例外が発生しても中断しないようにするにはどうすればよろしいでしょうか。
よろしくお願いします。
イメージ説明

C++

1#include "stdafx.h" 2 3#include <opencv2/highgui/highgui.hpp> 4#include <opencv2/imgproc/imgproc.hpp> 5#include <opencv2/aruco.hpp> 6#include <iostream> 7#include <fstream> 8#include <mutex> 9#include <thread> 10 11std::vector<std::vector<int>> result; 12std::vector<int> test; 13std::vector<std::vector<int>>test2; 14 15std::mutex mtx; 16 17 18void recognition(int xn, int yn, cv::Mat SplitImage) { 19 try { 20 int start_x = xn * 720; 21 int start_y = yn * 405; 22 cv::Mat SplitImage2; 23 cv::resize(SplitImage, SplitImage2, cv::Size(1920, 1080), CV_INTER_CUBIC); 24 25 cv::Ptr<cv::aruco::Dictionary> dictionary = cv::aruco::getPredefinedDictionary(cv::aruco::DICT_4X4_250); 26 27 28 //cv::imwrite("C://dev/temp/"+std::to_string(yn)+"_"+ std::to_string(xn)+".jpg", SplitImage2); 29 30 std::vector<int> markerIds; 31 std::vector<std::vector<cv::Point2f>> markerCorners, rejectedCandidates; 32 cv::Ptr<cv::aruco::DetectorParameters> parameters = cv::aruco::DetectorParameters::create(); 33 //parameters->minMarkerPerimeterRate = 0.01; 34 //parameters->cornerRefinementMethod = cv::aruco::CornerRefineMethod::CORNER_REFINE_CONTOUR; 35 //parameters->perspectiveRemoveIgnoredMarginPerCell = 0.05; 36 //parameters->maxErroneousBitsInBorderRate = 0.9; 37 //parameters->errorCorrectionRate = 0.6; 38 //parameters->markerBorderBits =1; 39 40 //parameters->minDistanceToBorder = 0; 41 parameters->minCornerDistanceRate = 0.2; 42 43 cv::aruco::detectMarkers(SplitImage2, dictionary, markerCorners, markerIds, parameters, rejectedCandidates); 44 45 46 if (markerIds.size() > 0) { 47 for (int mn = 0; mn < markerIds.size(); mn++) { 48 int id = markerIds.at(mn); 49 50 51 int x1 = markerCorners.at(mn).at(0).x; 52 int y1 = markerCorners.at(mn).at(0).y; 53 54 int x2 = markerCorners.at(mn).at(2).x; 55 int y2 = markerCorners.at(mn).at(2).y; 56 int leftx; 57 int lefty; 58 if (x1 < x2) { 59 leftx = x1; 60 } 61 else { 62 leftx = x2; 63 } 64 if (y1 < y2) { 65 lefty = y2; 66 } 67 else { 68 lefty = y1; 69 } 70 std::cout << "\r\n" << mn << ":" << markerIds.at(mn) <<",x:"<< xn <<",y:"<< yn << "\r\n"; 71 72 mtx.lock(); 73 test.push_back(yn * 100 + xn); 74 test2.push_back({ xn,yn }); 75 int x = leftx / 2 + start_x; 76 int y = lefty / 2 + start_y; 77 result.push_back({ id, x,y}); 78 79 mtx.unlock(); 80 } 81 82 83 } 84 SplitImage.release(); 85 SplitImage2.release(); 86 87 } 88 catch (...) { 89 std::cout << "Exception!\r\n"; 90 } 91} 92 93int main() 94{ 95 int camera = 3; 96 cv::VideoWriter writer("C:\dev\output" + std::to_string(camera) + ".mp4", cv::VideoWriter::fourcc('M', 'P', '4', '2'), 3.0, cv::Size(1920, 1080), true); 97 std::string str_filename = "C:\dev\output_text" + std::to_string(camera) + ".txt"; 98 const char *fileName = str_filename.c_str(); 99 std::ofstream ofs(fileName); 100 if (!ofs) 101 { 102 std::cout << "ファイルが開けませんでした。" << std::endl; 103 std::cin.get(); 104 return 0; 105 } 106 107 cv::VideoCapture cap("C:\Users\okada\Desktop\temp\total_test" + std::to_string(camera) + ".avi"); 108 int max_frame = cap.get(CV_CAP_PROP_FRAME_COUNT); //フレーム数 109 110 111 cv::Mat image, imageCopy; 112 //cv::Mat before= cv::Mat::ones(100, 160, CV_8U) * 100;; 113 for (int i = 0; i < max_frame; i++) { 114 115 try { 116 if (i > 100000) { 117 118 continue; 119 } 120 if (i < 420) { 121 cap >> image; //1フレーム分取り出してimgに保持させる 122 continue; 123 } 124 125 std::cout << "read image\r\n"; 126 127 cap >> image; //1フレーム分取り出してimgに保持させる 128 129 130 std::cout << "copy image\r\n"; 131 image.copyTo(imageCopy); 132 133 std::cout << i << "_size:" << result.size() << "\r\n"; 134 if (result.size() > 0) { 135 for (int rn = 0; rn < result.size(); rn++) { 136 std::vector<int> tempvector = result.at(rn); 137 if (!tempvector.empty()) { 138 int id = tempvector.at(0); 139 int x = tempvector.at(1); 140 int y = tempvector.at(2); 141 142 std::cout << id << "," << x << "," << y << "\r\n"; 143 144 } 145 } 146 } 147 result.clear(); 148 test.clear(); 149 test2.clear(); 150 151 std::cout << "create thread vector\r\n"; 152 std::vector<std::thread> thread_vec(25); 153 154 std::cout << "start thread\r\n"; 155 for (int yn = 0; yn < 5; yn++) { 156 for (int xn = 0; xn < 5; xn++) { 157 158 std::cout << yn<<"_"<<xn<<"\r\n"; 159 int start_x = xn * 720; 160 int start_y = yn * 405; 161 cv::Mat tempMat = imageCopy(cv::Range(start_y, start_y + 540), cv::Range(start_x, start_x + 960)); 162 //thread_vec.at(yn * 5 + xn) = std::thread(recognition, xn, yn, tempMat); 163 164 recognition(xn, yn, tempMat); 165 tempMat.release(); 166 } 167 } 168 169 std::cout << "wait thread\r\n"; 170 for (int tn = 0; tn < 25; tn++) { 171 172 //thread_vec.at(tn).join(); 173 } 174 175 std::cout << "check result\r\n"; 176 if (result.size() > 0) { 177 int *array = new int(result.size()); 178 std::cout << "1 fill\r\n"; 179 for (int rn = 0; rn < result.size() ; rn++) { 180 array[rn] = 1; 181 } 182 std::cout << "same id check\r\n"; 183 if (result.size() > 1) { 184 for (int rn = 0; rn < result.size() - 1; rn++) { 185 if (result.at(rn).empty()) { 186 break; 187 } 188 std::vector<int> tempvector = result.at(rn); 189 int id = tempvector.at(0); 190 for (int rn2 = rn + 1; rn2 < result.size(); rn2++) { 191 std::vector<int> tempvector2 = result.at(rn2); 192 if (tempvector2.empty()) { 193 break; 194 } 195 int id2 = tempvector2.at(0); 196 if (id == id2) { 197 array[rn2] = 0; 198 std::cout << "same id:"<<rn2<<","<<id2<<"\r\n"; 199 } 200 } 201 } 202 for (int backn = result.size() - 1; backn >= 0; backn--) { 203 if (array[backn] == 0) { 204 result.erase(result.begin() + backn); 205 } 206 } 207 } 208 209 210 std::cout << "write id\r\n"; 211 for (int rn = 0; rn < result.size(); rn++) { 212 //break; 213 std::vector<int> tempvector = result.at(rn); 214 if (tempvector.empty()) { 215 break; 216 } 217 int id = tempvector.at(0); 218 219 int x = tempvector.at(1); 220 int y = tempvector.at(2); 221 cv::Point left(x, y); 222 std::cout << rn << "," << id << "," << x << "," << y << "\r\n"; 223 if (id > 16) { 224 continue; 225 } 226 cv::putText(imageCopy, std::to_string(id), left, cv::FONT_HERSHEY_PLAIN, 6, cv::Scalar(0, 0, 255), 3, cv::LINE_AA); 227 228 229 ofs << camera << "," << i << "," << id << "," << x << "," << y << "\r\n"; 230 tempvector.clear(); 231 } 232 } 233 234 235 std::cout << "resize\r\n"; 236 237 cv::resize(imageCopy, imageCopy, cv::Size(1920, 1080), CV_INTER_CUBIC); 238 239 std::cout << "write\r\n"; 240 writer.write(imageCopy); 241 cv::resize(imageCopy, imageCopy, cv::Size(1280, 720), CV_INTER_CUBIC); 242 243// std::cout << "show\r\n"; 244// cv::imshow("Video", imageCopy); 245// cv::waitKey(1); 246 } 247 catch (...) { 248 std::cout << "catch exception:" << i << std::endl; 249 } 250 } 251 std::cout << "video output processing...\r\n"; 252 return 0; 253} 254

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問