跟踪栏结果未显示为C ++ / Opencv

时间:2016-07-14 20:59:58

标签: c++ opencv imshow trackbar

我从openCV documentation site复制了Harris角点检测器的代码,但我想让轨迹栏及其输出出现在同一个窗口中,所以我更新了代码

#include "stdafx.h"
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace cv;
using namespace std;

/// Global variables
Mat src, src_gray;
int thresh = 100;
int max_thresh = 255;

char* corners_window = "Corners detected";


void cornerHarris_demo( int, void* )
{

    Mat dst, dst_norm, dst_norm_scaled;
    dst = Mat::zeros( src.size(), CV_32FC1 );

    /// Detector parameters
    int blockSize = 2;
    int apertureSize = 3;
    double k = 0.04;

    /// Detecting corners
    cornerHarris( src_gray, dst, blockSize, apertureSize, k, BORDER_DEFAULT );

    /// Normalizing
    normalize( dst, dst_norm, 0, 255, NORM_MINMAX, CV_32FC1, Mat() );
    convertScaleAbs( dst_norm, dst_norm_scaled );

    /// Drawing a circle around corners
    for( int j = 0; j < dst_norm.rows ; j++ )
    { for( int i = 0; i < dst_norm.cols; i++ )
    {
        if( (int) dst_norm.at<float>(j,i) > thresh )
        {
            circle( src, Point( i, j ), 5, Scalar(255,0,0), 2, 8, 0 );
        }
    }
    }
    /// Showing the result
    imshow( corners_window, src);
}
/** @function main */
int main( int argc, char** argv )
{
    /// Load source image and convert it to gray
    char* filename = "myimage.jpg";
    src_gray = imread( filename, 0);
    cvtColor(src_gray,src,CV_GRAY2RGB);

    /// Create a window and a trackbar
    namedWindow( corners_window, CV_WINDOW_AUTOSIZE);
    createTrackbar( "Threshold: ", corners_window, &thresh, max_thresh, cornerHarris_demo );
    cornerHarris_demo( 0, 0 );

    waitKey(0);
    return(0);
}

问题是输出窗口无效我无法打开它并使用轨迹栏播放,但我可以从任务栏看到它。enter image description here

1 个答案:

答案 0 :(得分:1)

此更新有效

#include "stdafx.h"
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace cv;
using namespace std;

/// Global variables
Mat src, src_gray;
int thresh = 200;
int max_thresh = 255;


/// Function header
void cornerHarris_demo( int, void* );

/** @function main */
int main( int argc, char** argv )
{
  /// Load source image and convert it to gray
  src = imread("chessboard.jpg");
  cvtColor( src, src_gray, CV_BGR2GRAY );

  /// Create a window and a trackbar
  namedWindow( "Source image", CV_WINDOW_AUTOSIZE );
  createTrackbar( "Threshold: ", "Source image", &thresh, max_thresh, cornerHarris_demo );

  cornerHarris_demo( 0, 0 );

  waitKey(0);
  return(0);
}

/** @function cornerHarris_demo */
void cornerHarris_demo( int, void* )
{

  Mat dst, dst_norm, dst_norm_scaled, temp;
  src.copyTo(temp);
  dst = Mat::zeros( src.size(), CV_32FC1 );

  /// Detector parameters
  int blockSize = 2;
  int apertureSize = 3;
  double k = 0.04;

  /// Detecting corners
  cornerHarris( src_gray, dst, blockSize, apertureSize, k, BORDER_DEFAULT );

  /// Normalizing
  normalize( dst, dst_norm, 0, 255, NORM_MINMAX, CV_32FC1, Mat() );
  convertScaleAbs( dst_norm, dst_norm_scaled );

  /// Drawing a circle around corners
  for( int j = 0; j < dst_norm.rows ; j++ )
     { for( int i = 0; i < dst_norm.cols; i++ )
          {
            if( (int) dst_norm.at<float>(j,i) > thresh )
              {
               circle( temp, Point( i, j ), 5,  Scalar(255,0,0), 2, 8, 0 );
              }
          }
     }
  /// Showing the result
  imshow( "Source image", temp );
}

仍然不知道为什么第一个没有。