Beispiel #1
0
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 );
    
}
Beispiel #2
0
void ofxImagePreProcess::update(const cv::UMat & _src, cv::UMat & dst){
    
    cv::UMat src = _src.clone();
    // - - - - convert into Gray
    cvtColor( src, src, COLOR_BGR2GRAY );
    
    // - - - - filter
    //cv::bilateralFilter(camerauMat, mUMat, 7, 100, 7);
    cv::Size kernel = cv::Size(5,5);
    cv::boxFilter(src, mUMat, -1, kernel);

    //- - - - - get "detials image"
    cv::absdiff(src, mUMat, difMat);
    
    //- - - multiply
    cv::multiply(difMat, 20, difMat);
    
    // - - - -temporal filtering
    if(isInitial)
    {
        tempFilteredDifMat = difMat.clone();
        cv::multiply(tempFilteredDifMat, 1, tempFilteredDifMat);
        isInitial = false;
    }else{
        cv::addWeighted(tempFilteredDifMat,0.7,difMat,0.7,0.0, tempFilteredDifMat);
    }
    
    //- - - - then blur it.
    cv::Size Blurkernel = cv::Size(55,55);
    cv::blur(tempFilteredDifMat, regionMask, Blurkernel);
    
    // - - - then Thresh it.
    cv::threshold(regionMask, regionMask, 50, 255, THRESH_BINARY_INV);
    
    // - - - create masked image from src
    cv::UMat mask;
    mMaskOperated = src.clone();
    cv::multiply(regionMask, 1.0/255.0, mask);
    cv::multiply(mMaskOperated, mask, mMaskOperated);
    
    // - - - expand dynamic range
    // TODO parameters
    cv::subtract(mMaskOperated, 200, mMaskOperatedAndDym);
    cv::multiply(mMaskOperatedAndDym, 255.0 / (255.0 - 200) , mMaskOperatedAndDym);
    
    cv::subtract(src, mMaskOperatedAndDym, dst);
   
}
///
/// \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);
	}
}
void UBMS360::scaleBooleanMap(cv::UMat& map) {

	scaleMutex.lock();
	if (scaleMatrix.cols != map.cols && scaleMatrix.rows != map.rows) {
		cv::Mat scaleMat(map.size(), CV_32FC1);

		for (int i = 0; i < map.rows; ++i) {
			float c = std::cos(3.1415926535898f * static_cast<float>(map.rows / 2 - i) / map.rows);
			for (int j = 0; j < map.cols; ++j) {
				scaleMat.at<float>(i, j) = c;
			}
		}

		scaleMat.copyTo(scaleMatrix);
	}
	scaleMutex.unlock();

    
	cv::multiply(map, scaleMatrix, map);
    
}
cv::UMat UBMS::getAttentionMap(const cv::UMat& bm, int dilation_width_1, bool toNormalize, bool handle_border) {
	using namespace std::chrono;

	cv::UMat ret = bm.clone();

	int jump;
	if (handle_border) {

		cv::Mat cpuRet = ret.getMat(cv::ACCESS_FAST);

		for (int i = 0; i < bm.rows; i++) {

			jump = BMS_RNG.uniform(0.0, 1.0)>0.99 ? BMS_RNG.uniform(5, 25) : 0;
			if (cpuRet.at<uchar>(i, 0 + jump) != 1) {
				cv::floodFill(ret, cv::Point(0 + jump, i), cv::Scalar(1), 0, cv::Scalar(0), cv::Scalar(0), 8);
				//cpuRet = ret.getMat(cv::ACCESS_READ);
			}

			jump = BMS_RNG.uniform(0.0, 1.0)>0.99 ? BMS_RNG.uniform(5, 25) : 0;
			if (cpuRet.at<uchar>(i, bm.cols - 1 - jump) != 1) {
				cv::floodFill(ret, cv::Point(bm.cols - 1 - jump, i), cv::Scalar(1), 0, cv::Scalar(0), cv::Scalar(0), 8);
				//cpuRet = ret.getMat(cv::ACCESS_READ);
			}

		}

		for (int j = 0; j < bm.cols; j++) {

			jump = BMS_RNG.uniform(0.0, 1.0)>0.99 ? BMS_RNG.uniform(5, 25) : 0;
			if (cpuRet.at<uchar>(0 + jump, j) != 1) {
				cv::floodFill(ret, cv::Point(j, 0 + jump), cv::Scalar(1), 0, cv::Scalar(0), cv::Scalar(0), 8);
				//cpuRet = ret.getMat(cv::ACCESS_READ);
			}

			jump = BMS_RNG.uniform(0.0, 1.0)>0.99 ? BMS_RNG.uniform(5, 25) : 0;
			if (cpuRet.at<uchar>(bm.rows - 1 - jump, j) != 1) {
				cv::floodFill(ret, cv::Point(j, bm.rows - 1 - jump), cv::Scalar(1), 0, cv::Scalar(0), cv::Scalar(0), 8);
				//cpuRet = ret.getMat(cv::ACCESS_READ);
			}
		}
	}
	else {

		cv::Mat cpuRet = ret.getMat(cv::ACCESS_FAST);
		for (int i = 0; i < bm.rows; i++) {

			if (cpuRet.at<uchar>(i, 0) != 1) {
				cv::floodFill(ret, cv::Point(0, i), cv::Scalar(1), 0, cv::Scalar(0), cv::Scalar(0), 8);
				//cpuRet = ret.getMat(cv::ACCESS_READ);
			}

			if (cpuRet.at<uchar>(i, bm.cols - 1) != 1) {
				cv::floodFill(ret, cv::Point(bm.cols - 1, i), cv::Scalar(1), 0, cv::Scalar(0), cv::Scalar(0), 8);
				//cpuRet = ret.getMat(cv::ACCESS_READ);
			}

		}

		for (int j = 0; j < bm.cols; j++) {

			if (cpuRet.at<uchar>(0, j) != 1) {
				cv::floodFill(ret, cv::Point(j, 0), cv::Scalar(1), 0, cv::Scalar(0), cv::Scalar(0), 8);
				//cpuRet = ret.getMat(cv::ACCESS_READ);
			}


			if (cpuRet.at<uchar>(bm.rows - 1, j) != 1) {
				cv::floodFill(ret, cv::Point(j, bm.rows - 1), cv::Scalar(1), 0, cv::Scalar(0), cv::Scalar(0), 8);
				//cpuRet = ret.getMat(cv::ACCESS_READ);
			}

		}
	}

	

	cv::bitwise_xor(ret, cv::Scalar(1), ret);
	cv::UMat map1, map2;

	cv::bitwise_and(ret, bm, map1);
	cv::UMat notBM;

	cv::subtract(cv::Scalar(1), bm, notBM);
	cv::bitwise_and(ret, notBM, map2);

	if (dilation_width_1 > 0) {
		for (int k = 0; k < (dilation_width_1 - 1) / 2; ++k) {
			dilate(map1, map1, cv::UMat(), cv::Point(-1, -1), 3);
			dilate(map2, map2, cv::UMat(), cv::Point(-1, -1), 3);
		}
	}

	map1.convertTo(map1, CV_32FC1);
	map2.convertTo(map2, CV_32FC1);

	bmsNormalize(map1);
	bmsNormalize(map2);

	cv::add(map1, map2, map1);

	return map1;

}
Beispiel #6
0
cv::GMatDesc cv::descr_of(const cv::UMat &mat)
{
    return GMatDesc{ mat.depth(), mat.channels(),{ mat.cols, mat.rows } };
}