日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

opencv画图_c++

發布時間:2024/7/23 c/c++ 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 opencv画图_c++ 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

認識畫圖函數

#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc.hpp> //#include<iostream>#define w 400using namespace cv;/* 大量使用 Point 和 Scalar 這兩個結構: Point數據結構表示了由其圖像坐標 x 和 y 指定的2D點; 也可以用Point2f表示坐標由浮點數表示。Scalar是一個由長度為4的數組作為元素構成的結構體,Scalar最多可以存儲四個值,沒有提供的值默認是0; 此類型在OpenCV中被大量用于傳遞像素值,如用它來表示RGB顏色值(三個參數): Scalar( a, b, c ),那么定義的RGB顏色值為: Red = c, Green = b and Blue = a */ /// Function Declaration void MyEllipse(Mat img, double angle) {int thickness = 2;int lineType = 8;//線形為8連通線型ellipse(img,Point(int(w / 2.0), int(w / 2.0)),//中心點Size(w / 4, w / 16),//大小angle,//橢圓旋轉角度0,//擴展弧度起始點360,//終點Scalar(255, 0, 0), //使用Scalar類型數據設置colorthickness,lineType); } //void MyFilledCircle(Mat img, Point2f center); void MyFilledCircle(Mat img, Point2f center) {int thickness = -1; //封閉曲線,則要填充圖像int lineType = 8;circle(img,center,w / 32,Scalar(0, 0, 255), //設置colorthickness,lineType); }int main(int argc, char **argv) {/// Windows nameschar atom_window[] = "Drawing 1: Atom";/// Create black empty images Mat atom_image = Mat::zeros(w, w, CV_8UC3); //創建Mat類的對象atom_image,使用Mat類的zeros方法//參數CV_8UC3表示unsigned 8 bits,3通道(Channels)/// 1. Draw a simple atom:/// -----------------------/// 1.a. Creating ellipses MyEllipse(atom_image, 90);MyEllipse(atom_image, 0);MyEllipse(atom_image, 45);MyEllipse(atom_image, -45);/// 1.b. Creating circlesMyFilledCircle(atom_image, Point2f(w / 2.0, w / 2.0));//PointF,由于這里(System.Drawing)的“點”設計用于屏幕顯示用,//而屏幕顯示以像素為單位,一般使用整數形式的Point就足夠了/// 2. Display your stuff!imshow(atom_window, atom_image);imwrite("C:\\Users\\77607\\Desktop\\atom_image.jpg", atom_image);//需要將opencv*.dll拷貝一份放在和exe相同文件夾下waitKey(0);return(0); }

使用鼠標當畫筆畫圖

目標:

  • 學習使用OpenCV處理鼠標事件
  • 學習函數:cv::setMouseCallback()
  • void setMousecallback(const string& winname, MouseCallback onMouse, void* userdata=0)winname:窗口的名字onMouse:鼠標響應函數,回調函數。指定窗口里每次鼠標時間發生的時候,被調用的函數指針。 這個函數的原型應該為void on_Mouse(int event, int x, int y, int flags, void* param);userdate:傳給回調函數的參數 #include<opencv2\core\core.hpp> #include<opencv2\highgui\highgui_c.h> #include<opencv2\opencv.hpp> #include<opencv2\imgproc\imgproc.hpp> using namespace cv;char *window_name = "image"; // mouse callback function void draw_circle(int event, int x, int y, int flags, void* param); int main() {Mat img = Mat::zeros(512, 512, CV_8UC3);namedWindow(window_name);imshow(window_name, img);setMouseCallback(window_name, draw_circle, (void*)&img);while (1){if (cvWaitKey(20))break;}waitKey(0);return 0; } void draw_circle(int event, int x, int y, int flags, void* param) {Mat depth_img = *(Mat*)param; // 先轉換類型,再取數據if (event == CV_EVENT_LBUTTONDBLCLK)//位于highgui_c.h{circle(depth_img, cvPoint(x, y), 100, CV_RGB(0, 0, 255), -1);imshow(window_name, depth_img);} }

    可以通過鼠標輸入改變繪圖模式

    #include<opencv2\core\core.hpp> #include<opencv2\highgui\highgui_c.h> #include<opencv2\opencv.hpp> #include<opencv2\imgproc\imgproc.hpp> using namespace cv;char *window_name = "test"; bool mode = true; void drawByMouse(int event, int x, int y, int flags, void *param);int main(int argc, char* argv[]) {Mat img = Mat::zeros(800, 600, CV_8UC3);namedWindow(window_name);imshow(window_name, img);setMouseCallback(window_name, drawByMouse, (void*)&img);while (1){//imshow(window_name, img);int k = cvWaitKey(1);if (k == 'm')mode = !mode;else if (k == 27)break;}waitKey(0);return 0;}void drawByMouse(int event, int x, int y, int flags, void *param) {Mat depth_img = *(Mat*)param; // 先轉換類型,再取數據static CvPoint point_start, point_end;static bool draw_flag = false;switch (event){case CV_EVENT_LBUTTONDOWN://位于highgui_c.h{draw_flag = true;point_start = cvPoint(x, y);break;}case CV_EVENT_LBUTTONUP:{draw_flag = false;break;}case CV_EVENT_MOUSEMOVE:{if (draw_flag == true)if (mode == true){point_end = cvPoint(x, y);rectangle(depth_img, point_start, point_end, CV_RGB(0, 255, 0), -1);imshow(window_name, depth_img);}else{circle(depth_img, cvPoint(x, y), 3, CV_RGB(0, 0, 255), -1);imshow(window_name, depth_img);}}} }

    生產非填充的矩形

    //#include<opencv2\core\core.hpp> #include<opencv2\highgui\highgui_c.h> //#include<opencv2\imgproc\imgproc.hpp> #include<opencv2\opencv.hpp> #include<iostream>using namespace cv; #define WINDOW_NAME "【程序窗口】" //為窗口標題定義的宏 //c和c++中允許用一個標識符來表示一個字符串,稱為“宏”/*****************鼠標操作*****************/ Rect g_rect; //Recg類用于創建一個矩形對象,矩形左上角的橫坐標、縱坐標以及矩形的寬度、高度均為零。 bool g_DrawFlag = false; RNG g_rng(12345); //RNG類是opencv里C++的隨機數產生器。它可產生一個64位的int隨機數。 //RNG可以產生3種隨機數 //RNG(int seed) 使用種子seed產生一個64位隨機整數,默認 - 1 //計算機產生的隨機數都是偽隨機數,是根據種子seed和特定算法計算出來的。 //所以,只要種子一定,算法一定,產生的隨機數是相同的 //RNG::uniform() 產生一個均勻分布的隨機數 //RNG::gaussian() 產生一個高斯分布的隨機數 void on_MouseHandle(int event, int x, int y, int flag, void* param); void DrawRectangle(Mat& img, Rect box); void main() {//準備參數g_rect = Rect(-1, -1, 0, 0);Mat srcImage(600, 600, CV_8UC3), tempImage;srcImage.copyTo(tempImage);//image.copyTo(imageROI)。作用是把image的內容復制粘貼到imageROI上//g_rect = Rect(-1, -1, 0, 0);srcImage = Scalar::all(0);//設置鼠標操作回調函數namedWindow(WINDOW_NAME);setMouseCallback(WINDOW_NAME, on_MouseHandle, (void*)&srcImage);//繪畫while (1){srcImage.copyTo(tempImage);if (g_DrawFlag) {DrawRectangle(tempImage, g_rect);}imshow(WINDOW_NAME, tempImage);if (waitKey(10) == 27) break;//ESC 退出} } //鼠標回調事件 void on_MouseHandle(int event, int x, int y, int flag, void* param) {Mat& image = *(Mat*)param;switch (event){case EVENT_MOUSEMOVE://移動if (g_DrawFlag) {//計算,g_rect寬高=鼠標當前位置坐標-g_rect左上角的坐標g_rect.width = x - g_rect.x;g_rect.height = y - g_rect.y;}break;case EVENT_LBUTTONDOWN://左鍵按下g_DrawFlag = true;//設置g_rect的初始值在同一個點g_rect = Rect(x, y, 0, 0);break;case EVENT_LBUTTONUP://左鍵抬起//在畫填充矩形的程序中,鼠標移動時開始畫,非填充矩形是左鍵抬起開始畫g_DrawFlag = false;//當g_rect寬高小于0//起始點xy坐標置為較小靠左上角的點//寬高取絕對值if (g_rect.width < 0) {g_rect.x += g_rect.width;g_rect.width *= -1;}if (g_rect.height < 0) {g_rect.y += g_rect.height;g_rect.height *= -1;}//畫矩形DrawRectangle(image, g_rect);break;} } //矩形繪制函數 void DrawRectangle(Mat& img, Rect box) {//rectangle畫矩形//tl左上角的點,br右下角的點//Scalar設置顏色,設置為3通道//g_rng.uniform(0, 255)隨機顏色rectangle(img, box.tl(), box.br(), Scalar(g_rng.uniform(0, 255),g_rng.uniform(0, 255), g_rng.uniform(0, 255)));//box.tl(); //返回box的左上頂點的坐標//box.br(); //返回box的右下頂點的坐標 } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的opencv画图_c++的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。