我的跟踪栏有什么问题
What is wrong with my trackbar?
我已经使用OpenCV
构建了一个成功的边缘检测程序,该程序使用我的Macbook的相机,并具有根据原始图像中的不同通道打印各种边缘的选项,但是当我添加跟踪栏以允许更改Canny
的容差时,它既没有响应,又导致我的按键速度变慢。
怀疑我使用了这个错误,因为我的代码中的类似错误导致了同样的延迟,但我不确定这里出了什么问题。知道为什么我的跟踪栏没有响应吗?
#include "opencv2/core/core.hpp"
#include "opencv2/flann/miniflann.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/photo/photo.hpp"
#include "opencv2/video/video.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/calib3d/calib3d.hpp"
#include "opencv2/ml/ml.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/core/core_c.h"
#include "opencv2/highgui/highgui_c.h"
#include "opencv2/imgproc/imgproc_c.h"
#include <cstdlib>
using namespace cv;
using namespace std;
int showKind = 0;
int waitCount = 1; // wait for this many milliseconds to check for input
Mat channel(Mat A, int ich); // return the image with only this channel non-zero
Mat BW(Mat A); // return the black and white versin of this image
void myWaitKey();
Mat Blur(Mat A, int kernSize);
Mat Edges(Mat A, double tol1, double tol2);
int tol1 = 25;
int tol2 = 75;
int tol2Max = 250;
/// trackbar
void on_trackbar(int, void*) {
cout << "tol2 = " << tol2 << endl;
}
int main() {
VideoCapture stream1(0);
namedWindow("cam", CV_WINDOW_NORMAL);
if( !stream1.isOpened() ) {
cout << "Cannot open camera!" << endl;
}
string trackBarName = "tol2";
createTrackbar( trackBarName.c_str(), "cam", &tol2, tol2Max, on_trackbar);
on_trackbar( tol2, 0);
Mat cameraFrame; // showKind = 0
Mat grey; // showkind = 4
while( true ) {
/// read the cameraFrame
stream1.read(cameraFrame);
/// show the cameraFrame
if( showKind == 0 ) imshow("cam", cameraFrame);
else if( showKind > 0 && showKind < 4 ) imshow("cam", channel(cameraFrame, showKind));
else if( showKind == 4 ) imshow("cam", BW(cameraFrame) );
else if( showKind == 5 ) imshow("cam", Edges(channel(cameraFrame,1), tol1, tol2));
else if( showKind == 6 ) imshow("cam", Edges(channel(cameraFrame,2), tol1, tol2));
else if( showKind == 7 ) imshow("cam", Edges(channel(cameraFrame,3), tol1, tol2));
else if( showKind == 8 ) imshow("cam", Edges(cameraFrame, 25, 75));
else {
cout << "ERROR: Unknown showKind = " << showKind << endl;
}
myWaitKey();
}
return 0;
}
Mat channel(Mat A, int ich) {
Mat Channel[3];
Mat B;
split(A, Channel);
for(int i = 0; i < 3; i++) {
if( ich-1 != i ) Channel[i].setTo(0);
}
merge(Channel, 3, B);
return B;
}
Mat BW(Mat A) {
Mat B;
cvtColor( A, B, CV_BGR2GRAY );
return B;
}
void myWaitKey() {
int key = waitKey(waitCount);
if( key == 27 ) {
cout << "ESC pressed ... exiting" << endl;
exit(EXIT_SUCCESS);
}
// convert showKind
else if( key == 48 ){ showKind = 0; }
else if( key == 49 ){ showKind = 1; }
else if( key == 50 ){ showKind = 2; }
else if( key == 51 ){ showKind = 3; }
else if( key == 52 ){ showKind = 4; }
else if( key == 53 ){ showKind = 5; }
else if( key == 54 ){ showKind = 6; }
else if( key == 55 ){ showKind = 7; }
else if( key == 56 ){ showKind = 8; }
}
Mat Blur(Mat A, int kernSize) {
//Mat G = BW(A);
Mat C;
// C is now black and white
blur(A, C, Size(kernSize,kernSize));
return C;
}
Mat Edges(Mat A, double tol1, double tol2) {
Mat G = BW(Blur(A,4));
Mat E;
Canny(G, E, tol1, tol2);
A.copyTo(G, E);
return G;
}
看起来像Mac OS X上跟踪栏实现的问题。
也许这个答案会有所帮助:OSX 中的 OpenCV 跟踪条性能
-
请参阅下面的示例代码。我已经编写了这个演示代码。希望这对您有所帮助。
#include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" #include <stdlib.h> #include <stdio.h> using namespace cv; /// Global variables Mat src, src_gray; Mat dst, detected_edges; int edgeThresh = 1; int lowThreshold; int const max_lowThreshold = 100; int ratio = 3; int kernel_size = 3; char* window_name = "Edge Map"; void CannyThreshold(int, void*) { /// Reduce noise with a kernel 3x3 blur( src_gray, detected_edges, Size(3,3) ); /// Canny detector Canny( detected_edges, detected_edges, lowThreshold, lowThreshold*ratio, kernel_size ); /// Using Canny's output as a mask, we display our result dst = Scalar::all(0); src.copyTo( dst, detected_edges); imshow( window_name, dst ); } int main( int argc, char** argv ) { /// Load an image src = imread( argv[1] ); if( !src.data ) { return -1; } dst.create( src.size(), src.type() ); cvtColor( src, src_gray, CV_BGR2GRAY ); namedWindow( window_name, CV_WINDOW_AUTOSIZE ); createTrackbar( "Min Threshold:", window_name, &lowThreshold, max_lowThreshold, CannyThreshold ); CannyThreshold(0, 0); waitKey(0); return 0; }
相关文章:
- 警告处理为错误这里有什么问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 当我尝试添加 2 个大字符串时,我无法弄清楚出了什么问题
- 违反const正确性:我应该现实地期待什么问题
- 这个带有模板<类 Vector 的C++代码片段有什么问题>
- 我的逻辑反转字符串中的元音有什么问题?
- 需要以下代码的帮助,下面的代码有什么问题
- 常量公共成员有什么问题?
- 以下代码中的函数模板有什么问题?
- 这个返回元素位置的基于循环的函数有什么问题?
- creat_list2功能有什么问题?
- 格式说明符C++有什么问题
- 任何人都可以告诉我我的 C++ 代码出了什么问题?
- 从 argv[1] 转换为字符 * 字符串后有什么问题?
- 我的堆栈和库存清单程序的结构有什么问题?
- 此工厂功能有什么问题?
- 以下 C++ 代码有什么问题?
- 数组为此合并排序函数提供了正确的输出,但向量给出了不正确的输出.出了什么问题?
- reinterpret_cast,只读访问,简单的可复制类型,会出什么问题?
- 它解决了什么问题,对于非真空初始化,生命周期在初始化之前就开始了