从捕获的帧中裁剪三角形 - OpenCV 和 C++
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
的类型,我假设(如果不是这种情况,请参阅答案末尾的编辑(输入图像frame
也有3
通道。在这种情况下,我有点惊讶你甚至可以看到未裁剪的图像,因为运行你的代码只是在我的机器上调用bitwise_and
时抛出异常:
OpenCV(3.4.1) Error: Sizes of input arguments do not match
从文档中看,在我看来,您不能混合使用不同的输入和掩码类型。一个快速而肮脏的解决方案是将输入图像拆分为三个通道的向量,为每个通道调用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.rows,frame.cols,CV_8UC1);
在您的原始代码中。
相关文章:
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- OpenCV C++.快速计算混淆矩阵
- 绘制旋转的三角形
- 在C++代码中包含opencv时,使用ctypes创建.so文件
- 如何用for循环在c++中生成单词三角形
- 哪些库可以通过Opencv调整曝光率
- 安装opencv失败-粘贴CMakeError.log的内容
- C++中的openCV Mat访问冲突
- 如何使用递归打印修改后的星号三角形图案
- 从捕获的帧中裁剪三角形 - OpenCV 和 C++
- 使用 opencv 从图像中检测三角形和矩形
- C OPENCV三角形检测使用Hough Transform
- OpenCV:从Delaunay三角剖分中提取三角形
- OpenCV三角形点变化距离
- OpenCV三角形检测