[英]Cropping an triangle from captured frame - OpenCV and C++
我有一個視頻文件,正在從中捕獲幀。 我想從捕獲的幀中裁剪一個三角形並顯示它,但是我的程序僅顯示一個源幀。
這是我的代碼:
cv::Mat Detector::cropRegionOfInterest(cv::Mat& frame)
{
cv::Point corners[1][3];
corners[0][0] = cv::Point(0, frameHeight);
corners[0][1] = cv::Point(frameWidth, frameHeight);
corners[0][2] = cv::Point(frameWidth / 2, frameHeight / 2);
const cv::Point* cornerList[1] = { corners[0] };
int numPoints = 3;
int numPolygons = 1;
cv::Mat mask(frame.size(), CV_8UC1, cv::Scalar(0, 0, 0));
cv::fillPoly(mask, cornerList, &numPoints, numPolygons, cv::Scalar(255, 255, 255), 8);
cv::Mat result(frame.size(), CV_8UC3);
cv::bitwise_and(frame, mask, result);
return result;
}
我希望它不顯示源框架,而是顯示裁剪的三角形。
由於您使用CV_8UC3
作為result
類型, result
我假設(如果不是result
,請參見答案末尾的Edit)輸入圖像frame
也具有3
通道。 在那種情況下,您甚至可以看到未裁剪的圖像,讓我有些驚訝,因為運行代碼只是在調用bitwise_and
在我的計算機上引發異常:
OpenCV(3.4.1) Error: Sizes of input arguments do not match
根據文檔 ,在我看來您不能混合使用不同的輸入和掩碼類型。 一種快速而骯臟的解決方案是將輸入圖像分成三個通道的向量, bitwise_and
對每個通道調用bitwise_and
,然后將它們合並回去。 以下代碼對我有用:
#include <stdio.h>
#include <opencv2/opencv.hpp>
using namespace cv;
cv::Mat cropRegionOfInterest(cv::Mat& frame)
{
const int frameWidth=frame.cols-1;
const int frameHeight=frame.rows-1;
cv::Point corners[1][3];
corners[0][0] = cv::Point(0, frameHeight);
corners[0][1] = cv::Point(frameWidth, frameHeight);
corners[0][2] = cv::Point(frameWidth / 2, frameHeight / 2);
const cv::Point* cornerList[1] = { corners[0] };
int numPoints = 3;
int numPolygons = 1;
cv::Mat mask(frame.rows,frame.cols, CV_8UC1, cv::Scalar(0, 0, 0));
cv::fillPoly(mask, cornerList, &numPoints, numPolygons, cv::Scalar(255, 255, 255), 8);
std::vector<cv::Mat> src_channels;
std::vector<cv::Mat> result_channels;
cv::split(frame,src_channels);
for(int idx=0;idx<3;++idx)
{
result_channels.emplace_back(frame.rows,frame.cols,CV_8UC1);
cv::bitwise_and(src_channels[idx], mask,result_channels[idx]);
}
cv::Mat result;
cv::merge(result_channels,result);
return result;
}
int main(int argc, char** argv )
{
if ( argc != 2 )
{
printf("usage: DisplayImage.out <Image_Path>\n");
return -1;
}
Mat image;
image = imread( argv[1], 1 );
if ( !image.data )
{
printf("No image data \n");
return -1;
}
cv::Mat cropped=cropRegionOfInterest(image);
namedWindow("cropped Image", WINDOW_AUTOSIZE );
imshow("cropped Image", cropped);
waitKey(0);
return 0;
}
編輯:從您的評論看來, frame
實際上是灰度的。 在那種情況下, cv::Mat result(frame.size(), CV_8UC3);
上面的所有代碼,而只需更改cv::Mat result(frame.size(), CV_8UC3);
至
cv::Mat result(frame.rows,frame.cols,CV_8UC1);
在您的原始代碼中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.