【視覺項目】【day1】8.20號實驗記錄(初步使用模板匹配)

目錄

  • 【day1】8.20號實驗記錄(初步使用模板匹配)
    • 模板匹配
    • 單張圖的代碼
    • 利用多個模板去匹配多張圖的代碼
      • 寫代碼過程中遇到的問題

【day1】8.20號實驗記錄(初步使用模板匹配)

模板匹配

利用模板匹配可以框定出瓶子,但是卻不能分辨哪種瓶子是哪種瓶子。
對同一張圖片用不同的模板去進行匹配,選擇匹配度最高的作為最終的結果。
而且這種匹配受到模板大小的限制。若是攝像頭固定,視角固定,那這個問題可以解決。

單張圖的代碼

#include <opencv2/opencv.hpp>
#include "opencv2/features2d.hpp"
#include <vector>
#include <algorithm>
#include <iostream>
#include "windows.h"
#include <stdio.h>
#include <time.h>
#include <math.h>  
#define WINDOW_NAME "【程序窗口】"			
using namespace cv;
using namespace std;
int main()
{//改變控制臺字體顏色system("color 02");Mat srcImage=imread("D:\\opencv_picture_test\\視覺項目\\圓1.png");	//測試圖Mat tempMat = imread("D:\\opencv_picture_test\\視覺項目\\方template.png");	//模板圖//Mat srcImage=imread("D:\\opencv_picture_test\\img.png");	//測試圖//Mat tempMat = imread("D:\\opencv_picture_test\\template.png");	//模板圖cout << tempMat.cols << endl;cout << tempMat.rows << endl;Mat refMat;Mat resultMat;Mat dispMat;tempMat.copyTo(refMat);int match_method = TM_CCOEFF_NORMED;//采用模板與目標圖像像素與各自圖像的平均值計算dot product,正值越大匹配度越高,負值越大圖像的區別越大,但如果圖像沒有明顯的特征(即圖像中的像素值與平均值接近)則返回值越接近0;matchTemplate(srcImage, refMat, resultMat, match_method);normalize(resultMat, resultMat, 0, 1, NORM_MINMAX, -1, Mat());	//歸一化double minVal; double maxVal; Point minLoc; Point maxLoc; Point matchLoc;	//定義最大值最小值以及它們的位置變量minMaxLoc(resultMat, &minVal, &maxVal, &minLoc, &maxLoc, Mat());	//從結果矩陣中找到匹配度最大以及最小的值并且確定其位置//對于方法SQDIFF和SQDIFF_NORMED兩種方法來講,越小的值就有著更高的匹配結果//而其余的方法則是數值越大匹配效果越好if (match_method == TM_SQDIFF || match_method == TM_SQDIFF_NORMED)matchLoc = minLoc;elsematchLoc = maxLoc;srcImage.copyTo(dispMat);//circle(dispMat, matchLoc, 5, Scalar(0, 0, 255), 2, 8, 0);//以最佳匹配點為中心繪制與模板相同大小的框rectangle(dispMat, matchLoc, Point(matchLoc.x + refMat.cols, matchLoc.y + refMat.rows), Scalar::all(0), 2, 8, 0);namedWindow("template", WINDOW_NORMAL);//WINDOW_NORMAL允許用戶自由伸縮imshow("template", refMat);namedWindow("srcImage", WINDOW_NORMAL);//WINDOW_NORMAL允許用戶自由伸縮imshow("srcImage", dispMat);waitKey(0);return 0;
}

利用多個模板去匹配多張圖的代碼

寫代碼過程中遇到的問題

1、要理解好result矩陣的含義
2、match_method 要多試幾種
3、不同模板對同一張測試圖匹配后得到的result數組中,不需要對其歸一化,不然會發現,每個模板的最佳值都是1(使用TM_CCORR_NORMED時),這樣就比較不了了。

#include <opencv2/opencv.hpp>
#include "opencv2/features2d.hpp"
#include <vector>
#include <algorithm>
#include <iostream>
#include "windows.h"
#include <stdio.h>
#include <time.h>
#include <math.h>  
#define WINDOW_NAME "【程序窗口】"			
using namespace cv;
using namespace std;void show_text(int nums)
{if (nums == 0){cout << "方" << endl;}else if (nums == 1){cout << "v圓" << endl;}else if (nums == 2){cout << "圓" << endl;}else if (nums == 3){cout << "小" << endl;}else if (nums == 4){cout << "中" << endl;}else{cout << "無" << endl;}
}
int main()
{//改變控制臺字體顏色system("color 02");//創建模板vectorvector<Mat>tempMat;//插入模板元素Mat temp = imread("D:\\opencv_picture_test\\視覺項目\\方template.png");tempMat.push_back(temp);temp = imread("D:\\opencv_picture_test\\視覺項目\\v圓template.png");tempMat.push_back(temp);temp = imread("D:\\opencv_picture_test\\視覺項目\\圓template.png");tempMat.push_back(temp);temp = imread("D:\\opencv_picture_test\\視覺項目\\小template.png");tempMat.push_back(temp);temp= imread("D:\\opencv_picture_test\\視覺項目\\中template.png");tempMat.push_back(temp);Mat tempMat1 = tempMat[0];Mat tempMat2 = tempMat[1];Mat tempMat3 = tempMat[2];Mat tempMat4 = tempMat[3];Mat tempMat5 = tempMat[4];//獲取模板數目int tempMat_Nums = tempMat.size();//獲取測試圖像Mat srcImage=imread("D:\\opencv_picture_test\\視覺項目\\v圓1.png");	//測試圖Mat resultMat;Mat dispMat;int match_method = TM_CCORR_NORMED;		//經過試錯發現此參數較好。//用每個模板去匹配測試圖,并且找出每次結果的最佳匹配值,將值存入vector中vector<double>goodval;vector<Point>goodlock;int matchnum = 0;Point matchLoc;for (int i = 0;i < tempMat_Nums;i++){//采用模板與目標圖像像素與各自圖像的平均值計算dot product,正值越大匹配度越高,負值越大圖像的區別越大,但如果圖像沒有明顯的特征(即圖像中的像素值與平均值接近)則返回值越接近0;matchTemplate(srcImage, tempMat[i], resultMat, match_method);//不歸一化,因為不同模板歸一化后的最佳值皆為1,無法比較//normalize(resultMat, resultMat, 0, 1, NORM_MINMAX, -1, Mat());	//歸一化double minVal; double maxVal; Point minLoc; Point maxLoc;	//定義最大值最小值以及它們的位置變量minMaxLoc(resultMat, &minVal, &maxVal, &minLoc, &maxLoc, Mat());	//從結果矩陣中找到匹配度最大以及最小的值并且確定其位置//對于方法SQDIFF和SQDIFF_NORMED兩種方法來講,越小的值就有著更高的匹配結果//而其余的方法則是數值越大匹配效果越好if (match_method == TM_SQDIFF || match_method == TM_SQDIFF_NORMED){goodlock.push_back(minLoc);goodval.push_back(minVal);}else{goodlock.push_back(maxLoc);goodval.push_back(maxVal);}cout << i << "  "<<maxVal << endl;}//找到goodval中最佳的一組if (match_method == TM_SQDIFF || match_method == TM_SQDIFF_NORMED){auto goodPosition = min_element(goodval.begin(), goodval.end());matchnum = distance(begin(goodval), goodPosition);}else{auto goodPosition = max_element(goodval.begin(), goodval.end());matchnum = distance(begin(goodval), goodPosition);}show_text(matchnum);matchLoc = goodlock[matchnum];srcImage.copyTo(dispMat);//circle(dispMat, matchLoc, 5, Scalar(0, 0, 255), 2, 8, 0);//以最佳匹配點為中心繪制與模板相同大小的框rectangle(dispMat, matchLoc, Point(matchLoc.x + tempMat[matchnum].cols, matchLoc.y + tempMat[matchnum].rows), Scalar::all(0), 2, 8, 0);//namedWindow("template", WINDOW_NORMAL);//WINDOW_NORMAL允許用戶自由伸縮//imshow("template", tempMat);namedWindow("srcImage", WINDOW_NORMAL);//WINDOW_NORMAL允許用戶自由伸縮imshow("srcImage", dispMat);waitKey(0);return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/378385.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/378385.shtml
英文地址,請注明出處:http://en.pswp.cn/news/378385.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

第四章 纖維結構對染色性能的影響單元測驗

1,利用紅外光譜技術可以測定纖維的() 化學結構。 2,纖維完整的結構包括() 化學結構。 表面形態結構。 內部超分子結構。 3,纖維化學結構由于影響了纖維(),進而影響其染色性能 吸濕溶脹性能。 在染液中電離性能。 在染浴中的帶電性。 與染液中各組分之間的作用力。 …

創建存儲過程時出現的This function has none of DETERMINISTIC, NO SQL解決辦法

This function has none of DETERMINISTIC, NO SQL解決辦法創建存儲過程時 出錯信息&#xff1a; ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the …

如何讓沒有安裝網頁中所需字體的用戶也能得到一致的瀏覽效果【轉】

今天給大家談一個關于字體的話題,我們在做項目的過程中會遇到一些在psd中的字體在自己的電腦中沒有安裝&#xff0c;或者是一些特殊的文字&#xff0c;通常的做法是把它切成圖片&#xff0c;但是如果這個站是多個語言的&#xff0c;那我們是不是把每個語言的都切一張圖片呢&…

【視覺項目】【day4】8.24號實驗記錄(消除瓶子內部“邊緣”)

思路分析以及代碼 思路1&#xff1a;使用findContours函數&#xff0c;設置輪廓為最外部RETR_EXTERNAL&#xff0c;結果發現結果仍然是所有輪廓。 思路2&#xff1a;先二值化&#xff0c;然后進行閉操作&#xff0c;然后canny&#xff0c;得到的輪廓確實比之前少很多&#xff…

operator.ne_Python operator.ne()函數與示例

operator.neoperator.ne()函數 (operator.ne() Function) operator.ne() function is a library function of operator module, it is used to perform "not equal to operation" on two values and returns True if the first value is not equal to the second val…

國產操作系統和linux 之間的關系,為何國產系統大多基于開源Linux?操作系統從0做起到底有多難?...

今年貌似是國產操作系統的“爆發”之年&#xff0c;除了老牌的銀河麒麟、中標麒麟、深度之外&#xff0c;中興近日發布了自己的“新支點”&#xff0c;華為也公開了自研的操作系統“鴻蒙”。縱觀這些國產操作系統&#xff0c;大多基于開源的Linux。那么為什么我們不可以從0開始…

away3d創建基礎view世界(基礎 一)

對于away3d可能很多人有畏懼心里&#xff0c;其實away3d沒有想象中的那么難&#xff0c;現在我就教大家創建一個簡單的view世界。 package{import away3d.containers.View3D;import flash.display.Sprite;public class Main extends Sprite{private var view:View3D;//興建一個…

operator.eq_Python operator.eq()函數與示例

operator.eqoperator.eq()函數 (operator.eq() Function) operator.eq() function is a library function of operator module, it is used to perform "equal to operation" on two values and returns True if the first value is equal to the second value, Fals…

智能車復工日記【7】:關于會車的圖像問題

目錄 系列文章更換掃線方式獲取車的輪廓車屁股所在行數確定白色球臺導致的問題5.21思考1、 關于會車地點確定如何判斷會車狀態博主聯系方式: QQ:1540984562 QQ交流群:892023501 群里會有往屆的smarters和電賽選手,群里也會不時分享一些有用的資料,有問題可以在群里多問問。…

詳解Spring 3.0 基于Annotation 的依賴注入實現

簡介&#xff1a; Spring 的依賴配置方式與 Spring 框架的內核自身是松耦合設計的。然而&#xff0c;直到 Spring 3.0 以前&#xff0c;使用 XML 進行依賴配置幾乎是唯一的選擇。Spring 3.0 的出現改變了這一狀況&#xff0c;它提供了一系列的針對依賴注入的注解&#xff0c;這…

linux如何停用xdmcp服務,如何禁用XDMCP服務

看你用到是什么linux版本&#xff0c;例如下面&#xff1a;For kdm (which comes with the KDE desktop), it is a replacement of xdm and configures the same way, except its files are in /etc/X11/kdm in Caldera/SCO, /etc/kde/kdm in Red Hat (and Fedora Core) and /u…

第一章 基礎知識

這篇博文是本人在學習《Python基礎教程 &#xff08;第3版&#xff09;》的時候所記錄下來的關鍵要點&#xff0c;書中的核心知識點也都在本篇博客中所涉及&#xff0c;需要耐心每天堅持點點滴滴學習進步 第一章 基礎知識 數和表達式 1&#xff0c;執行整除運算// 4//3 —&…

Python operator.le()函數與示例

operator.le()函數 (operator.le() Function) operator.le() function is a library function of operator module, it is used to perform "less than or equal to operation" on two values and returns True if the first value is less than or equal to the sec…

jQuery.validator

$(document).ready(function(){ /* 設置默認屬性 */$.validator.setDefaults({ submitHandler: function(form) { form.submit(); } }); // 中文字兩個字節 jQuery.validator.addMethod("byteRangeLength", function(value, element, param) { var length value.le…

js 第四課

正則表達式&#xff1a;RegExp對象 正則表達式描述一個字符模式的對象&#xff0c;或者說用某種模式去匹配一類字符串的一個公式。 1.創建 可以用RegExp構造函數和直接量兩種方式。正則表達式直接量被包含在一對"/"中. 1 var partern1 RegExp(\\d*); 2 …

第二章 列表和元組

第二章 列表和元組 在Python中&#xff0c;最基本的數據結構為序列&#xff08;包括列表、元組、字符串等&#xff09;&#xff08;sequence&#xff09; 列表是可以修改的&#xff0c;而元組不可以 Python支持一種數據結構的基本概念&#xff0c;名為容器&#xff08;contain…

linux下mac風格菜單欄,ubuntu 8.04 安裝mac風格菜單

ubuntu 8.04 安裝mac風格菜單發布時間:2008-07-13 00:22:22來源:紅聯作者:bindex這只是一份草案文檔&#xff0c;它可能會導致一些計算機故障。引言這份指南假定你沒有在電腦上編譯過其他程序&#xff0c;并且&#xff0c;假定你使用的是Ubuntu Gusty。1.使用deb包安裝 32位系統…

解析法實現一元線性回歸、多元線性回歸以及數據模型可視化操作

目錄【1】解析法實現一元線性回歸python列表實現利用Numpy實現利用TensorFlow實現數據和模型可視化【2】解析法實現多元線性回歸利用Numpy實現需要用到的NumPy數組運算函數數據和模型可視化繪制空間點集&#xff1a;繪制空間平面圖&#xff1a;繪制線框圖并且與散點圖對比&…

帶有示例的Python File readlines()方法

文件readlines()方法 (File readlines() Method) readlines() method is an inbuilt method in Python, it is used to get all lines from the file, the method is called with this object (current file stream/IO object) and returns all available lines in the file, w…

32位系統win2008+mssql2008 6G內存折騰紀實

十年沒搞硬件了&#xff0c;現在計算機發展到大硬盤大內存的時代了。一直都少搞服務器配置、運營&#xff0c;以前弄服務器都是普通的PC來當服務器。公司原來的一個業務系統用的是mssql2000好幾年了&#xff0c;由于業務數據越積壓越多最大的一張表已經有7000多萬條記錄了&…