首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从捕获的帧中裁剪三角形- OpenCV和C++

从捕获的帧中裁剪三角形- OpenCV和C++
EN

Stack Overflow用户
提问于 2018-10-13 13:52:49
回答 1查看 278关注 0票数 0

我有一个视频文件,我从其中捕捉一个帧。我想从捕获的帧中裁剪一个三角形并显示它,但是我的程序只显示一个源帧。

这是我的代码:

代码语言:javascript
复制
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;
}

而不是显示源帧,我希望它显示裁剪三角形。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-13 14:35:58

由于您使用CV_8UC3作为result的类型,所以我假设(如果不是这样的话,请参阅答案末尾的编辑),输入图像frame也有3通道。在这种情况下,您甚至可以看到非裁剪的映像,这让我有点惊讶,因为运行代码只是在调用bitwise_and时在我的机器上抛出一个异常。

代码语言:javascript
复制
OpenCV(3.4.1) Error: Sizes of input arguments do not match

文档来看,在我看来,您不能混合不同的输入和掩码类型。一个快速而肮脏的解决方案是将输入图像分割成一个由三个通道组成的向量,为每个通道调用bitwise_and,然后将它们合并回去。下面的代码适用于我:

代码语言:javascript
复制
#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);更改为

代码语言:javascript
复制
cv::Mat result(frame.rows,frame.cols,CV_8UC1);

在你原来的密码里。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52793649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档