opencv画图_c++
生活随笔
收集整理的這篇文章主要介紹了
opencv画图_c++
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
認(rèn)識(shí)畫圖函數(shù)
#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc.hpp> //#include<iostream>#define w 400using namespace cv;/* 大量使用 Point 和 Scalar 這兩個(gè)結(jié)構(gòu): Point數(shù)據(jù)結(jié)構(gòu)表示了由其圖像坐標(biāo) x 和 y 指定的2D點(diǎn); 也可以用Point2f表示坐標(biāo)由浮點(diǎn)數(shù)表示。Scalar是一個(gè)由長(zhǎng)度為4的數(shù)組作為元素構(gòu)成的結(jié)構(gòu)體,Scalar最多可以存儲(chǔ)四個(gè)值,沒有提供的值默認(rèn)是0; 此類型在OpenCV中被大量用于傳遞像素值,如用它來(lái)表示RGB顏色值(三個(gè)參數(shù)): 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)),//中心點(diǎn)Size(w / 4, w / 16),//大小angle,//橢圓旋轉(zhuǎn)角度0,//擴(kuò)展弧度起始點(diǎn)360,//終點(diǎn)Scalar(255, 0, 0), //使用Scalar類型數(shù)據(jù)設(shè)置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), //設(shè)置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); //創(chuàng)建Mat類的對(duì)象atom_image,使用Mat類的zeros方法//參數(shù)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)的“點(diǎn)”設(shè)計(jì)用于屏幕顯示用,//而屏幕顯示以像素為單位,一般使用整數(shù)形式的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); }使用鼠標(biāo)當(dāng)畫筆畫圖
目標(biāo):
可以通過(guò)鼠標(biāo)輸入改變繪圖模式
#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; // 先轉(zhuǎn)換類型,再取數(shù)據(jù)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);}}} }生產(chǎn)非填充的矩形
//#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 "【程序窗口】" //為窗口標(biāo)題定義的宏 //c和c++中允許用一個(gè)標(biāo)識(shí)符來(lái)表示一個(gè)字符串,稱為“宏”/*****************鼠標(biāo)操作*****************/ Rect g_rect; //Recg類用于創(chuàng)建一個(gè)矩形對(duì)象,矩形左上角的橫坐標(biāo)、縱坐標(biāo)以及矩形的寬度、高度均為零。 bool g_DrawFlag = false; RNG g_rng(12345); //RNG類是opencv里C++的隨機(jī)數(shù)產(chǎn)生器。它可產(chǎn)生一個(gè)64位的int隨機(jī)數(shù)。 //RNG可以產(chǎn)生3種隨機(jī)數(shù) //RNG(int seed) 使用種子seed產(chǎn)生一個(gè)64位隨機(jī)整數(shù),默認(rèn) - 1 //計(jì)算機(jī)產(chǎn)生的隨機(jī)數(shù)都是偽隨機(jī)數(shù),是根據(jù)種子seed和特定算法計(jì)算出來(lái)的。 //所以,只要種子一定,算法一定,產(chǎn)生的隨機(jī)數(shù)是相同的 //RNG::uniform() 產(chǎn)生一個(gè)均勻分布的隨機(jī)數(shù) //RNG::gaussian() 產(chǎn)生一個(gè)高斯分布的隨機(jī)數(shù) void on_MouseHandle(int event, int x, int y, int flag, void* param); void DrawRectangle(Mat& img, Rect box); void main() {//準(zhǔn)備參數(shù)g_rect = Rect(-1, -1, 0, 0);Mat srcImage(600, 600, CV_8UC3), tempImage;srcImage.copyTo(tempImage);//image.copyTo(imageROI)。作用是把image的內(nèi)容復(fù)制粘貼到imageROI上//g_rect = Rect(-1, -1, 0, 0);srcImage = Scalar::all(0);//設(shè)置鼠標(biāo)操作回調(diào)函數(shù)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 退出} } //鼠標(biāo)回調(diào)事件 void on_MouseHandle(int event, int x, int y, int flag, void* param) {Mat& image = *(Mat*)param;switch (event){case EVENT_MOUSEMOVE://移動(dòng)if (g_DrawFlag) {//計(jì)算,g_rect寬高=鼠標(biāo)當(dāng)前位置坐標(biāo)-g_rect左上角的坐標(biāo)g_rect.width = x - g_rect.x;g_rect.height = y - g_rect.y;}break;case EVENT_LBUTTONDOWN://左鍵按下g_DrawFlag = true;//設(shè)置g_rect的初始值在同一個(gè)點(diǎn)g_rect = Rect(x, y, 0, 0);break;case EVENT_LBUTTONUP://左鍵抬起//在畫填充矩形的程序中,鼠標(biāo)移動(dòng)時(shí)開始畫,非填充矩形是左鍵抬起開始畫g_DrawFlag = false;//當(dāng)g_rect寬高小于0//起始點(diǎn)xy坐標(biāo)置為較小靠左上角的點(diǎn)//寬高取絕對(duì)值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;} } //矩形繪制函數(shù) void DrawRectangle(Mat& img, Rect box) {//rectangle畫矩形//tl左上角的點(diǎn),br右下角的點(diǎn)//Scalar設(shè)置顏色,設(shè)置為3通道//g_rng.uniform(0, 255)隨機(jī)顏色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的左上頂點(diǎn)的坐標(biāo)//box.br(); //返回box的右下頂點(diǎn)的坐標(biāo) } 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的opencv画图_c++的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Matlab——图像缩放(插值法)
- 下一篇: MFC制作员工信息管理系统