3

OpenCV (640x320) でカメラから 1 つの解像度フィードを適切に取得し、半分にカットしてフレームの半分 (320x240) のみを表示するにはどうすればよいですか。縮小するのではなく、実際にトリミングします。OpenCV 2.4.5、VS2010、および C++ を使用しています

この非常に標準的なコードは 640x480 の入力解像度を取得し、解像度を 320x240 にトリミングするためにいくつかの変更を加えました。IplImage の代わりに Mat を使用する必要がありますか? もしそうなら、何が最善の方法でしょうか?

#include "stdafx.h"
#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;
}
4

4 に答える 4

2

を取得しているかどうかを確認していないと思いますCvCapture。カメラが 1 台しかない私のシステムでは、カメラ 1 を照会するため、コードは機能しません。ただし、最初のカメラは 0 にする必要があります。したがって、このコードを変更します。

CvCapture* capture = cvCaptureFromCAM(1);  //Capture using camera 1 connected to system

1へ ( に変更することに注意してください0):

CvCapture* capture = cvCaptureFromCAM(0);  //Capture using camera 1 connected to system
if (! capture ){
    /*your error handling*/
}

それ以上に、あなたのコードは私のために働いているようです。NULL を取得していないかどうか、他のポインター値を確認することもできます。

于 2013-06-27T20:35:36.197 に答える
1

次の関数を呼び出すことで、ビデオを簡単にトリミングできます。

cvSetMouseCallback("image", mouseHandler, NULL);

mouseHandler機能はそのとおりです。

void mouseHandler(int event, int x, int y, int flags, void* param){
    if (event == CV_EVENT_LBUTTONDOWN && !drag)
    {
        /* left button clicked. ROI selection begins */
        select_flag=0;
        point1 = Point(x, y);
        drag = 1;
    }

    if (event == CV_EVENT_MOUSEMOVE && drag)
    {
        /* mouse dragged. ROI being selected */
        Mat img1 = img.clone();
        point2 = Point(x, y);
        rectangle(img1, point1, point2, CV_RGB(255, 0, 0), 3, 8, 0);
        imshow("image", img1);
    }

    if (event == CV_EVENT_LBUTTONUP && drag)
    {
        point2 = Point(x, y);
        rect = Rect(point1.x,point1.y,x-point1.x,y-point1.y);
        drag = 0;
        roiImg = img(rect);
    }

    if (event == CV_EVENT_LBUTTONUP)
    {
       /* ROI selected */
        select_flag = 1;
        drag = 0;
    }
}

詳細については、次のリンクを参照してください。: OpenCV を使用してウェブカメラからビデオをトリミングする方法

于 2016-06-25T07:48:26.587 に答える
0

これはPythonでは簡単です...しかし、重要なアイデアは、cv2配列を参照してスライスできることです。必要なのは のスライスだけですframein

次のコードは、(0,0) から (320,240) までのスライスを取ります。numpy 配列は列の優先順位でインデックス付けされることに注意してください。

# Required modules
import cv2

# Constants for the crop size
xMin = 0
yMin = 0
xMax = 320
yMax = 240

# Open cam, decode image, show in window
cap = cv2.VideoCapture(0) # use 1 or 2 or ... for other camera
cv2.namedWindow("Original")
cv2.namedWindow("Cropped")
key = -1
while(key < 0):
    success, img = cap.read()

    cropImg = img[yMin:yMax,xMin:xMax] # this is all there is to cropping

    cv2.imshow("Original", img)
    cv2.imshow("Cropped", cropImg)

    key = cv2.waitKey(1)
cv2.destroyAllWindows()
于 2013-06-29T01:32:51.037 に答える