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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

OpenCV

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

C++

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

Q&A

解決済

1回答

3796閲覧

OpenCVのエラーを解決したい.

okomee

総合スコア1

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

OpenCV

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

C++

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

0グッド

1クリップ

投稿2020/05/16 05:06

前提・実現したいこと

C++,OpenCVを用いてHOG特徴量の計算をするプログラムを作成したのですが,以下のようにエラーが出ます.

発生している問題・エラーメッセージ

OpenCV: terminate handler is called! The last OpenCV error is: OpenCV(3.4.10) Error: The function/feature is not implemented (Unsupported combination of buffer format (=5), and destination format (=4)) in cv::opt_AVX2::getLinearColumnFilter, file C:/build/3_4_winpack-build-win64-vc15/opencv/modules/imgproc/src/filter.simd.hpp, line 3021

該当のソースコード

C++

1#include"pch.h" 2#include <iostream> 3#include <stdio.h> 4#include <stdlib.h> 5#include <string> 6#include <vector> 7 8#include "opencv2/imgproc.hpp" 9#include "opencv2/features2d.hpp" 10#include "opencv2/highgui.hpp" 11#include "opencv2/core.hpp" 12#include "opencv2/imgcodecs.hpp" 13 14using namespace std; 15using namespace cv; 16 17vector<Mat> caluculateIntegralHOG(const Mat& image); 18void caluculateHOGInCell(Mat& hogCell, Rect roi, const vector<Mat>& integrals); 19Mat getHOG(Point pt, const vector<Mat>integrals); 20 21 22 23 24//ベクトルの次元はブロックの大きさ×ブロックの大きさ×勾配の方向数 25 26//ビン(階級の個数) 27#define N_BIN 9 28 29//何度ずつに分けて投票するか(分解能) 30#define THETA (180/N_BIN) 31 32 33//セルの大きさ(ピクセル数) 34#define CELL_SIZE 20 35 36//ブロックの大きさ(セル数)※奇数 37#define BLOCK_SIZE 3 38 39//ブロックの大きさの半分 40#define R (CELL_SIZE*(BLOCK_SIZE)*0.5) 41 42 43 44 45 46 47int main(int argc, const char **argv) { 48 49 FILE *fp = NULL; 50 string sFilepath, sSaveFIlepath; 51 errno_t err; 52 string sMainFolder = "C:/food"; 53 54 Mat input_image; 55 56 cout << "sFilepath="; 57 cin >> sFilepath; 58 59 input_image = imread(sFilepath, IMREAD_COLOR); 60 61 62 Mat gray_image; 63 64 cvtColor(input_image, gray_image, CV_BGR2GRAY); 65 66 //積分画像の作成 67 vector<Mat>integrals = caluculateIntegralHOG(gray_image); 68 69 //ある点のHOG特徴量を求めるにはMat hist=getHOG(Point(x,y),integrals);とする.histはSize(81,1)CV_32F 70 71 /* **************************************** 72 73 以下表示のための処理 74 75 ********************************************/ 76 77 //表示用の画像を用意(半分の輝度に) 78 Mat image = input_image.clone(); 79 80 image *= 0.5; 81 82 //格子点でHOG計算 83 Mat meanHOGInBlock(Size(N_BIN, 1), CV_32F); 84 85 for (int y = CELL_SIZE / 2; y < image.rows; y += CELL_SIZE) { 86 for (int x = CELL_SIZE / 2; x < image.cols; x += CELL_SIZE) { 87 88 //(x,y)でHOGを取得 89 Mat hist = getHOG(Point(x, y), integrals); 90 //ブロックがはみ出していたらcontinue 91 if (hist.empty())continue; 92 93 //ブロックごとに勾配ヒストグラム生成 94 meanHOGInBlock = Scalar(0); 95 96 for (int i = 0; i < N_BIN; i++) { 97 for (int j = 0; j < BLOCK_SIZE*BLOCK_SIZE; j++) { 98 99 meanHOGInBlock.at<float>(0, i) += hist.at<float>(0, i + j * N_BIN); 100 } 101 } 102 //L2ノルムで正規化(強い方向が強調される) 103 normalize(meanHOGInBlock, meanHOGInBlock, 1, 0, CV_L2); 104 105 //角度ごとに線を描画 106 Point center(x, y); 107 for (int i = 0; i < N_BIN; i++) { 108 double theta = (i * THETA + 90.0)*CV_PI / 180; 109 Point rd(CELL_SIZE*0.5*cos(theta), CELL_SIZE*0.5*sin(theta)); 110 Point rp = center - rd; 111 Point lp = center - -rd; 112 line(image, rp, lp, Scalar(255 * meanHOGInBlock.at<float>(0, i), 255, 255)); 113 } 114 115 116 } 117 } 118 // 表示 119 namedWindow("out", WINDOW_AUTOSIZE); 120 imshow("out", image); 121 waitKey(0); 122 123 return 0; 124 125} 126 127//積分画像の作成 128vector<Mat> caluculateIntegralHOG(const Mat& image) { 129 130 //微分 131 Mat xsobel, ysobel; 132 Sobel(image, xsobel, CV_32S, 1, 0, 3); 133 Sobel(image, ysobel, CV_32S, 0, 1, 3); 134 135 //角度別の画像(9つ)を生成しておく 136 vector<Mat>bins(N_BIN); 137 for (int i = 0; i < N_BIN; i++) { 138 bins[i] = Mat::zeros(image.size(), CV_32F); 139 } 140 141 //X,Y微分画像を勾配方向(angle)と強度(magnitude)に変換 142 Mat Imag, Iang; 143 144 cartToPolar(xsobel, ysobel, Imag, Iang, true);//true->degree[0,360),false->rad[0,2π) 145 146 //勾配方向を[0,180)にする 147 add(Iang, Scalar(180), Iang, Iang < 0); 148 add(Iang, Scalar(-180), Iang, Iang >= 180); 149 150 //勾配方向を[0,1,2.....8]にする準備 151 Iang /= THETA; 152 153 //勾配方向を強度で重みをつけて,角度別に投票する 154 for (int y = 0; y < image.rows; y++) { 155 for (int x = 0; x < image.cols; x++) { 156 int ind = Iang.at<float>(y, x); 157 bins[ind].at<float>(y, x) += Imag.at<float>(y, x); 158 } 159 } 160 161 //角度別に積分画像を作成する 162 vector<Mat>integrals(N_BIN); 163 for (int i = 0; i < N_BIN; i++) { 164 integral(bins[i], integrals[i]); 165 } 166 167 return integrals; 168 169} 170 171 172//HOG特徴量を計算する 173//pt::ブロックの中心点 174Mat getHOG(Point pt, const vector<Mat>integrals) { 175 //ブロックが画像からはみ出していないか確認 176 177 if (pt.x - R < 0 || pt.y - R < 0 || pt.x + R >= integrals[0].cols || pt.y + R >= integrals[0].rows) { 178 return Mat(); 179 } 180 //与点を中心としたブロックでセルごとに勾配ヒストグラムを求めて連結 181 Mat hist(Size(N_BIN*BLOCK_SIZE*BLOCK_SIZE, 1), CV_32F); 182 Point tl(0, pt.y - R); 183 int c = 0; 184 185 for (int i = 0; i < BLOCK_SIZE; i++) { 186 tl.x = pt.x - R; 187 for (int j = 0; i < BLOCK_SIZE; i++) { 188 Mat temp = hist.colRange(c, c + N_BIN); 189 caluculateHOGInCell(temp, Rect(tl, tl + Point(CELL_SIZE, CELL_SIZE)), integrals); 190 tl.x += CELL_SIZE; 191 c += N_BIN; 192 } 193 tl.y += CELL_SIZE; 194 } 195 196 //L2ノルムで正規化 197 normalize(hist, hist, 1, 0, NORM_L2); 198 return hist; 199 200 201} 202//セル内の勾配ヒストグラムを求める 203void caluculateHOGInCell(Mat& hogCell, Rect roi, const vector<Mat>& integrals) { 204 205 206 int x0 = roi.x; 207 int y0 = roi.y; 208 int x1 = x0 + roi.width; 209 int y1 = y0 + roi.height; 210 211 for (int i = 0; i < N_BIN; i++) { 212 Mat integral = integrals[i]; 213 214 float a = integral.at<double>(y0, x0); 215 float b = integral.at<double>(y1, x1); 216 float c = integral.at<double>(y0, x1); 217 float d = integral.at<double>(y1, x0); 218 219 hogCell.at<float>(0, i) = (a + b) - (c + d); 220 } 221}

補足情報(FW/ツールのバージョンなど)

OpenCVのバージョンは3.4.10です.

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

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

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

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

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

guest

回答1

0

ベストアンサー

caluculateIntegralHOG関数の

c++

1Sobel(image, xsobel, CV_32S, 1, 0, 3); 2Sobel(image, ysobel, CV_32S, 0, 1, 3);

でエラーになっているようです。
デバッグしてみるとddepthCV_32Sがアサーションにかかっているようです。
当方の環境 (OpenCV 4.1.0) ではCV_32SCV_32Fに変更すると、エラーにならずに実行できました。
プログラムの内容を理解しているわけではないので、実行結果が正しいのかどうかは判断できないです。

投稿2020/05/16 08:16

Bull

総合スコア986

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問