我从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);
}
问题是输出窗口处于非 Activity 状态,我无法将其打开并与轨迹栏一起播放,但是我可以从任务栏看到它。
最佳答案
此更新有效
#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 );
}
仍然不知道为什么第一个没有。