最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ OpenCV實戰(zhàn)之標記點檢測的實現(xiàn)

 更新時間:2022年03月22日 15:36:08   作者:光電的一只菜雞  
這篇文章主要介紹了如何利用C++ OpenCV實現(xiàn)關鍵點的檢測,文中的示例代碼講解詳細,對我們學習OpenCV有一定幫助,感興趣的小伙伴可以了解一下

在實際應用中,能夠直接利用霍夫圓檢測這些理想方法的應用場景是非常少的,更多的是利用擬合的辦法去尋找圓形。

大致思路如下,首先先選擇要處理的ROI部分,記錄下該圖的左上點在原圖的坐標,如果原圖過大,要先進行等比例縮放;然后利用自適應閾值和Canny邊緣提取進行處理,再進行閉運算與輪廓檢測,計算點集面積,通過篩選面積閾值去除雜點,最后進行輪廓檢測,擬合橢圓,效果如下:

1.導入原圖:

2.截取ROI

3.進行自適應閾值化與Canny邊緣提取

4.進行閉運算,然后輪廓檢測,然后計算點集面積,通過面積閾值去除雜點

5.再次進行輪廓檢測,擬合橢圓

代碼如下:

#include <opencv2\highgui\highgui.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <opencv2\core\core.hpp>
#include <iostream>

#define scale 2//圖像縮放因子
#define cannythreshold 80

typedef struct _ROIStruct
{
	cv::Point2d ROIPoint;
	cv::Mat ROIImage;
}ROIStruct;

ROIStruct getROI(cv::Mat src,bool flag = false)
{
	ROIStruct ROI_Struct;
	cv::Rect2d ROIrect = selectROI(src);
	ROI_Struct.ROIPoint = ROIrect.tl();//獲取ROI區(qū)域左上角的點
	ROI_Struct.ROIImage = src(ROIrect);

	if (flag == true)
	{
		cv::imshow("ROI", ROI_Struct.ROIImage);
	}

	return ROI_Struct;
}
int main()
{
	cv::Mat srcImage = cv::imread("7.jpg");//讀取待處理的圖片
	cv::resize(srcImage, srcImage, cv::Size(srcImage.cols / scale, srcImage.rows / scale));//圖像縮放,否則原來圖像會在ROI時顯示不下
	
	ROIStruct ROI = getROI(srcImage);//選擇ROI區(qū)域
	
	cv::Mat DetectImage, thresholdImage;
	ROI.ROIImage.copyTo(DetectImage);
	cv::imshow("ROI", DetectImage);
	cv::cvtColor(DetectImage, thresholdImage, CV_RGB2GRAY);
	cv::adaptiveThreshold(thresholdImage, thresholdImage, 255, CV_ADAPTIVE_THRESH_GAUSSIAN_C, CV_THRESH_BINARY,11,35);//自適應閾值
	cv::Canny(thresholdImage, thresholdImage, cannythreshold, cannythreshold * 3, 3);
	
	cv::imshow("thresholdImage", thresholdImage);
	
	std::vector<std::vector<cv::Point>> contours1;
	std::vector<cv::Vec4i> hierarchy1;
	cv::Mat element = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(3, 3));
	cv::morphologyEx(thresholdImage, thresholdImage, cv::MORPH_CLOSE, element,cv::Point(-1,-1),2);
	cv::Mat findImage = cv::Mat::zeros(thresholdImage.size(), CV_8UC3);

	cv::findContours(thresholdImage, contours1, hierarchy1,CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);

	for (int i = 0; i <contours1.size();i++)
	{
		double area = cv::contourArea(contours1[i]);
		//std::cout << i << "點集區(qū)域面積:" << area << std::endl;
		
		if (area < 120)
		{
			continue;
		}

		else
		{
			drawContours(findImage, contours1, i, cv::Scalar(255, 255, 255), -1, 8, cv::Mat(), 0, cv::Point());
		}

	}

	cv::imshow("drawing", findImage);

	cv::Mat CircleImage(findImage.size(),CV_8UC1);
	findImage.copyTo(CircleImage);
	cv::cvtColor(CircleImage, CircleImage, CV_RGB2GRAY);
	
	std::vector<std::vector<cv::Point>> contours2;
	std::vector<cv::Vec4i> hierarchy2;

	cv::Mat resultImage(CircleImage.size(), CV_8UC3);
	cv::findContours(CircleImage, contours2, hierarchy2, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);
	std::vector<cv::Point> points1, points2;
	
	cv::Mat compareImage;
	DetectImage.copyTo(compareImage);

	for (int j = 0; j <contours2.size();j++)
	{
		cv::RotatedRect box = cv::fitEllipse(contours2[j]);
		points1.push_back(box.center);
		ellipse(resultImage, box, cv::Scalar(0, 0, 255), 1, CV_AA);
		ellipse(compareImage, box, cv::Scalar(0, 0, 255), 1, CV_AA);
	}
	
	for (int i = 0; i < points1.size(); i++)
	{
		cv::Point ans;
		ans.x = ROI.ROIPoint.x + points1[i].x;
		ans.x = ans.x*scale;
		ans.y = ROI.ROIPoint.y + points1[i].y;
		ans.y = ans.y*scale;
		points2.push_back(ans);
	}

	std::cout << points1 << std::endl;
	std::cout << ROI.ROIPoint << std::endl;
	std::cout << points2 << std::endl;

	cv::imshow("resultImage", resultImage);
	cv::imshow("compareImage", compareImage);
	cv::waitKey(0);
	return 0;
}

到此這篇關于C++ OpenCV實戰(zhàn)之標記點檢測的實現(xiàn)的文章就介紹到這了,更多相關C++ OpenCV標記點檢測內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C++輸入輸出重定向方法示例

    C++輸入輸出重定向方法示例

    這篇文章主要給大家介紹了關于C++輸入輸出重定向的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-09-09
  • 二叉樹入門和刷題詳解

    二叉樹入門和刷題詳解

    這篇文章主要介紹了二叉樹入門和刷題詳解的相關資料,需要的朋友可以參考下
    2023-07-07
  • C++11中delete和default的用法詳解

    C++11中delete和default的用法詳解

    這篇文章主要為大家詳細介紹了C++11中delete和default的具體用法,文中的示例代碼簡潔易懂,具有一定的學習價值,感興趣的小伙伴可以了解下
    2023-08-08
  • MFC框架之OnIdle案例詳解

    MFC框架之OnIdle案例詳解

    這篇文章主要介紹了MFC框架之OnIdle案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-08-08
  • c++ bitset詳解

    c++ bitset詳解

    這篇文章主要介紹了C++ bitset用法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-08-08
  • C++中頭文件和源文件詳細介紹

    C++中頭文件和源文件詳細介紹

    這篇文章主要介紹了C++中頭文件和源文件詳細介紹的相關資料,需要的朋友可以參考下
    2017-02-02
  • C++實現(xiàn)LeetCode(19.移除鏈表倒數(shù)第N個節(jié)點)

    C++實現(xiàn)LeetCode(19.移除鏈表倒數(shù)第N個節(jié)點)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(19.移除鏈表倒數(shù)第N個節(jié)點),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-07-07
  • C++和C的混合編譯的項目實踐

    C++和C的混合編譯的項目實踐

    本文主要介紹了C++和C的混合編譯的項目實踐,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • C語言實現(xiàn)簡單的五子棋小游戲

    C語言實現(xiàn)簡單的五子棋小游戲

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡單的五子棋小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 詳解如何將Spire.Doc for C++集成到C++程序中

    詳解如何將Spire.Doc for C++集成到C++程序中

    Spire.Doc for C++是一個專業(yè)的Word庫,供開發(fā)人員在任何類型的C++應用程序中閱讀、創(chuàng)建、編輯、比較和轉換 Word 文檔,本文演示了如何以兩種不同的方式將 Spire.Doc for C++ 集成到您的 C++ 應用程序中,希望對大家有所幫助
    2023-05-05

最新評論

姚安县| 卢氏县| 抚州市| 抚松县| 景东| 枝江市| 依兰县| 万安县| 平顺县| 临桂县| 馆陶县| 乐山市| 喀什市| 大荔县| 盐边县| 美姑县| 萨嘎县| 于都县| 横山县| 临桂县| 津市市| 元氏县| 四川省| 诸暨市| 漯河市| 贵阳市| 土默特右旗| 延吉市| 玉门市| 南丰县| 德清县| 临泽县| 宁蒗| 新昌县| 南靖县| 深水埗区| 浮梁县| 锦屏县| 宁南县| 巴林左旗| 乌苏市|