2016-07-14 2 views
0

Я скопировал код Харриса детектора от openCV documentation site, но я хотел сделать TrackBar и его выход отображается в том же окне, поэтому я обновил код, чтобы бытьTrackBar Результат не отображается C++/OpenCV

#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

Это обновление работает

#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); 
} 

до сих пор не знаю, почему первый один не сделал.

Смежные вопросы