徐州住房和城鄉(xiāng)建設(shè)局網(wǎng)站/互聯(lián)網(wǎng)營銷師證書怎么考
- 操作系統(tǒng):ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 編程語言:C++11
算法描述
進(jìn)行點在輪廓內(nèi)的測試。
該函數(shù)確定點是在輪廓內(nèi)、輪廓外,還是位于一條邊上(或與頂點重合)。它返回正值(內(nèi)部)、負(fù)值(外部),或零值(在一條邊上)。當(dāng) measureDist=false 時,返回值分別是 +1(內(nèi)部)、-1(外部)和 0(在一條邊上)。否則,返回值是從點到最近輪廓邊的帶符號距離。
下面是一個函數(shù)樣本輸出,其中每個圖像像素都經(jīng)過了輪廓測試:
函數(shù)原型
double cv::pointPolygonTest
(InputArray contour,Point2f pt,bool measureDist
)
參數(shù)
- 參數(shù)contour 輸入的輪廓。
- 參數(shù)pt 要測試的點。
- 參數(shù)measureDist 如果為 true,則函數(shù)估計點到最近輪廓邊緣的帶符號距離。否則,函數(shù)只檢查點是否在輪廓內(nèi)部。
返回值
- 當(dāng) measureDist=false 時,返回值是:
- +1:如果點在輪廓內(nèi)部。
- -1:如果點在輪廓外部。
- 0:如果點在輪廓的邊上或與頂點重合。
- 當(dāng) measureDist=true 時,返回值是從點到最近輪廓邊的帶符號距離。距離為正表示點在輪廓內(nèi)部,距離為負(fù)表示點在輪廓外部,距離為零表示點在輪廓邊上或與頂點重合。
代碼示例
#include <iostream>
#include <opencv2/opencv.hpp>int main()
{// 創(chuàng)建一個空白的圖像cv::Mat image = cv::Mat::zeros( 300, 300, CV_8UC3 );// 創(chuàng)建一個示例輪廓std::vector< cv::Point > contour;contour.push_back( cv::Point( 100, 100 ) );contour.push_back( cv::Point( 200, 100 ) );contour.push_back( cv::Point( 200, 200 ) );contour.push_back( cv::Point( 100, 200 ) );// 繪制輪廓std::vector<std::vector<cv::Point>> contours(1, contour);cv::drawContours(image, contours, 0, cv::Scalar(0, 255, 0), 2); // 在三通道圖像的第一個輪廓上繪制綠色線條// 顯示原始圖像cv::imshow( "Original Image", image );// 創(chuàng)建一個掩碼圖像cv::Mat mask = cv::Mat::zeros( image.size(), CV_8UC1 );// 遍歷每個像素并測試其位置for ( int y = 0; y < image.rows; ++y ){for ( int x = 0; x < image.cols; ++x ){cv::Point2f pixel( x, y );float result = cv::pointPolygonTest( contour, pixel, false );if ( result >= 0 ){mask.at< uchar >( y, x ) = 255; // 內(nèi)部 如果點在輪廓內(nèi)部,則在掩碼圖像上標(biāo)記為白色(255)。}else{mask.at< uchar >( y, x ) = 125; // 內(nèi)部}}}// 顯示掩碼圖像cv::imshow( "Mask Image", mask );cv::waitKey( 0 );return 0;
}