1. 程式人生 > >opencv如何實現【不用全局變量進行滾動條控制】

opencv如何實現【不用全局變量進行滾動條控制】

找到 stat static png std -1 threshold argv 自帶

opencv中自帶滾動條,其中一個問題是該回調函數(on_trackbar)大多使用的是全局變量,大型項目調試時弊端眾多,比如下圖:

技術分享

為此,留意了void on_Trackbar(int par1, void *)中的第二個參數,

按理說,這是允許用戶傳遞參數進入的,但網上及書籍中未找到不用全局變量而自己傳參數的例子,因此特意寫了一版可以自己傳局部參數的寫法。

代碼如下:

#include <opencv2/opencv.hpp>
using namespace cv;
namespace ycv {
    class Win {
    public:
        Win(
string name,int type); void imshow(Mat &img); string name; }; } namespace ycv { Win::Win(string name, int type) { this->name = name; namedWindow(this->name, type); } void Win::imshow(Mat &img) { cv::imshow(this->name,img); } }
void on_Trackbar(int par1, void *pvoid) { static void *p1 = (void*)(*(0+((int*)pvoid))); static void *p2 = (void*)(*(1 + ((int*)pvoid))); static void *p3 = (void*)(*(2 + ((int*)pvoid))); std::string *winname = (std::string*)p1; Mat *mgray = (Mat*)p2; Mat *mbin = (Mat*)p3; adaptiveThreshold(
*mgray, *mbin, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY, par1>1 ? (par1%2==1 ? par1 : par1+1) : 3, 11); imshow(*winname, *mbin); } int main(int argc, char** argv) { ycv::Win w1 = ycv::Win("窗口1", CV_WINDOW_NORMAL); Mat mgray = imread("1.jpg"); Mat mbin; cvtColor(mgray, mgray, CV_BGR2GRAY); if (!mgray.data) { std::cout << "read error\n" << std::endl; return -1; } int gs = 71; createTrackbar("滑動條1", w1.name, &gs, 333, on_Trackbar); int *p[3]; p[0] = (int*)&w1.name; p[1] = (int*)&mgray; p[2] = (int*)&mbin; on_Trackbar(gs, p); waitKey(); return 0; }

opencv如何實現【不用全局變量進行滾動條控制】