void ofxImagePreProcess::calcHist(const cv::UMat & mat) { cv::Mat img = mat.getMat(ACCESS_READ).clone(); // ヒストグラムを生成するために必要なデータ int image_num = 1; // 入力画像の枚数 int channels[] = { 0 }; // cv::Matの何番目のチャネルを使うか 今回は白黒画像なので0番目のチャネル以外選択肢なし cv::MatND hist; // ここにヒストグラムが出力される int dim_num = 1; // ヒストグラムの次元数 int bin_num = 64; // ヒストグラムのビンの数 int bin_nums[] = { bin_num }; // 今回は1次元のヒストグラムを作るので要素数は一つ float range[] = { 0, 256 }; // 扱うデータの最小値、最大値 今回は輝度データなので値域は[0, 255] const float *ranges[] = { range }; // 今回は1次元のヒストグラムを作るので要素数は一つ // 白黒画像から輝度のヒストグラムデータ(=各binごとの出現回数をカウントしたもの)を生成 cv::calcHist(&img, image_num, channels, regionMask.getMat(ACCESS_READ), hist, dim_num, bin_nums, ranges); std::cout << hist << std::endl; /// - - - cv::Mat hist_img; { // histogramを描画するための画像領域を確保 int img_width = 512; int img_height = 512; hist_img = cv::Mat(cv::Size(img_width, img_height), CV_8UC3, cv::Scalar::all(255)); // ヒストグラムのスケーリング // ヒストグラムのbinの中で、頻度数最大のbinの高さが、ちょうど画像の縦幅と同じ値になるようにする double max_val = 0.0; cv::minMaxLoc(hist, 0, &max_val); hist = hist * (max_val ? img_height / max_val : 0.0); // ヒストグラムのbinの数だけ矩形を書く for (int j = 0; j < bin_num; ++j){ // saturate_castは、安全に型変換するための関数。桁あふれを防止 int bin_w = cv::saturate_cast<int>((double)img_width / bin_num); cv::rectangle( hist_img, cv::Point(j*bin_w, hist_img.rows), cv::Point((j + 1)*bin_w, hist_img.rows - cv::saturate_cast<int>(hist.at<float>(j))), cv::Scalar::all(0), -1); } } drawCvUmat(hist_img.getUMat(ACCESS_READ).clone(), 600, 0, 400, 400 ); }
/// /// \brief YoloDarknetDetector::Detect /// \param gray /// void YoloDarknetDetector::Detect(cv::UMat& colorFrame) { m_regions.clear(); cv::Mat colorMat = colorFrame.getMat(cv::ACCESS_READ); #if 1 std::shared_ptr<image_t> detImage = m_detector->mat_to_image_resize(colorMat); std::vector<bbox_t> detects = m_detector->detect_resized(*detImage, colorMat.cols, colorMat.rows, m_confidenceThreshold, false); #else std::vector<bbox_t> detects = m_detector->detect(colorMat, m_confidenceThreshold, false); #endif for (const bbox_t& bbox : detects) { m_regions.emplace_back(cv::Rect(bbox.x, bbox.y, bbox.w, bbox.h), m_classNames[bbox.obj_id], bbox.prob); } }