我是OpenCV的初学者,我想自动裁剪网络摄像头供稿,即通过指定矩形的值而不是使用鼠标手柄。我尝试了以下代码,但显示的是黑屏,而不是网络摄像头。可能是什么原因?

#include <iostream>
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"

using namespace std;
char key;
int main()
{
    cvNamedWindow("Camera_Output", 1);    //Create window

    CvCapture* capture = cvCaptureFromCAM(1);  //Capture using camera 1 connected to system
    cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH, 640 );
    cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT, 480 );

    while(1){ //Create loop for live streaming

        IplImage* framein = cvQueryFrame(capture); //Create image frames from capture

        /* sets the Region of Interest  - rectangle area has to be __INSIDE__ the image */
        cvSetImageROI(framein, cvRect(0, 0, 320, 240));

        /* create destination image  - cvGetSize will return the width and the height of ROI */
        IplImage *frameout = cvCreateImage(cvGetSize(framein),  framein->depth, framein->nChannels);

        /* copy subimage */
        cvCopy(framein, frameout, NULL);

        /* always reset the Region of Interest */
        cvResetImageROI(framein);

        cvShowImage("Camera_Output", frameout);   //Show image frames on created window

        key = cvWaitKey(10);     //Capture Keyboard stroke
        if (char(key) == 27){
            break;      //ESC key loop will break.
        }
    }

    cvReleaseCapture(&capture); //Release capture.
    cvDestroyWindow("Camera_Output"); //Destroy Window
    return 0;
}

最佳答案

我不喜欢Open CV的C接口(interface),所以我建议您通过Open CV 3.4.0的C++接口(interface)解决方案

#include <Windows.h>
#include <Vfw.h>
#include <string>
#include <iostream>
#include "opencv2\core\core.hpp"
#include "opencv2\imgproc\imgproc.hpp"
#include "opencv2\imgcodecs\imgcodecs.hpp"
#include "opencv2\highgui\highgui.hpp"

using namespace cv;
using namespace std;

int main()
{

    VideoCapture camera;
    camera.open(0);
    if (!camera.isOpened()) {
        cout << "Failed to open camera." << std::endl;
        return -1;
    }
    Mat frame, oMatCrop;

    while(1){ //Create loop for live streaming

        camera >> frame;
        oMatCrop=frame(cv::Rect(0,0,320,240));

        cv::namedWindow("Image",CV_WINDOW_FREERATIO);
        cv::imshow("Image", frame);

        cv::namedWindow("Cropped image",CV_WINDOW_FREERATIO);
        cv::imshow("Cropped image", oMatCrop);

        if (waitKey(50) == 27) {
            break;
        }
    }
    return 0;
}

我也放在结果下方

opencv - 如何使用OpenCV和C&#43;&#43;裁剪网络摄像头提要帧-LMLPHP

关于opencv - 如何使用OpenCV和C++裁剪网络摄像头提要帧,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50346834/

10-16 12:03