mirror of
https://github.com/opencv/opencv.git
synced 2025-01-22 09:36:59 +08:00
eb981cc7d7
* Update videoio.hpp add VideoCapturePropertie for clossbar input pin setting * Update cap_dshow.cpp For some kind of capture card, such as "avermedia cv710 " , it use SerialDigital as input pin and so it can not work. Here added new PhysicalConnectorType enumeration: PhysConn_Video_YRYBY and PhysConn_Video_SerialDigital to support it. And also provide new property parameter CAP_CROSSBAR_INPIN_TYPE to set the crossbar input pin type which will be used in videoInput::start(int deviceID, videoDevice *VD): " if(VD->useCrossbar) { DebugPrintOut("SETUP: Checking crossbar\n"); routeCrossbar(&VD->pCaptureGraph, &VD->pVideoInputFilter, VD->connection, CAPTURE_MODE); } " And at last ,fixed one issue for function setSizeAndSubtype, added code pVih->rcSource.top = pVih->rcSource.left = pVih->rcTarget.top =pVih->rcTarget.left=0; pVih->rcSource.right = pVih->rcTarget.right= attemptWidth; pVih->rcSource.bottom = pVih->rcTarget.bottom = attemptHeight; without these code , rcSource and rcTarget will keeping use default resolution and cause fail in hr = VD->streamConf->SetFormat(VD->pAmMediaType) and cannot find suitable MediaType. Tested with python3 and mfc (Avermedia cv710) Python3 code: import cv2 print("test cv") cap=cv2.VideoCapture(0) cap.set(5,60) cap.set(3,1920) cap.set(4,1080) cap.set(31,6) ret,img=cap.read() cv2.namedWindow("cap",cv2.WINDOW_NORMAL) cv2.resizeWindow("cap",960,640); while True: ret,img=cap.read() if ret==False: continue cv2.imshow("cap",img) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows() MFC code: void CcvtestDlg::OnBnClickedButton1() { VideoCapture cap(0); cap.set(CAP_PROP_FRAME_WIDTH, 1920); cap.set(CAP_PROP_FRAME_HEIGHT, 1080); cap.set(CAP_CROSSBAR_INPIN_TYPE , 6); Mat img; namedWindow("test", WINDOW_NORMAL); resizeWindow("test", 960, 640); while (1) { if (cap.read(img)) { imshow("test", img); if ('q' ==waitKey(1)) break; } } destroyAllWindows(); cap.release(); } * Update cap_dshow.cpp * Update videoio.hpp move enum value of CAP_CROSSBAR_INPIN_TYPE to the end of list * Update videoio.hpp * Update cap_dshow.cpp removed trailing whitespace * Update test_camera.cpp Add test for capture device using PhysConn_Video_SerialDigital as crossbar input pin * Update test_camera.cpp Correction of misunderstanding about how to add test case.
71 lines
2.5 KiB
C++
71 lines
2.5 KiB
C++
// This file is part of OpenCV project.
|
|
// It is subject to the license terms in the LICENSE file found in the top-level directory
|
|
// of this distribution and at http://opencv.org/license.html.
|
|
|
|
// Note: all tests here are DISABLED by default due specific requirements.
|
|
// Don't use #if 0 - these tests should be tested for compilation at least.
|
|
//
|
|
// Usage: opencv_test_videoio --gtest_also_run_disabled_tests --gtest_filter=*VideoIO_Camera*<tested case>*
|
|
|
|
#include "test_precomp.hpp"
|
|
|
|
namespace opencv_test { namespace {
|
|
|
|
TEST(DISABLED_VideoIO_Camera, basic)
|
|
{
|
|
VideoCapture capture(0);
|
|
ASSERT_TRUE(capture.isOpened());
|
|
std::cout << "Camera 0 via " << capture.getBackendName() << " backend" << std::endl;
|
|
std::cout << "Frame width: " << capture.get(CAP_PROP_FRAME_WIDTH) << std::endl;
|
|
std::cout << " height: " << capture.get(CAP_PROP_FRAME_HEIGHT) << std::endl;
|
|
std::cout << "Capturing FPS: " << capture.get(CAP_PROP_FPS) << std::endl;
|
|
|
|
const int N = 100;
|
|
Mat frame;
|
|
int64 time0 = cv::getTickCount();
|
|
for (int i = 0; i < N; i++)
|
|
{
|
|
SCOPED_TRACE(cv::format("frame=%d", i));
|
|
|
|
capture >> frame;
|
|
ASSERT_FALSE(frame.empty());
|
|
|
|
EXPECT_GT(cvtest::norm(frame, NORM_INF), 0) << "Complete black image has been received";
|
|
}
|
|
int64 time1 = cv::getTickCount();
|
|
printf("Processed %d frames on %.2f FPS\n", N, (N * cv::getTickFrequency()) / (time1 - time0 + 1));
|
|
|
|
capture.release();
|
|
}
|
|
|
|
//Following test if for capture device using PhysConn_Video_SerialDigital as crossbar input pin
|
|
TEST(DISABLED_VideoIO_Camera, dshow_avermedia_capture)
|
|
{
|
|
VideoCapture capture(0);
|
|
ASSERT_TRUE(capture.isOpened());
|
|
capture.set(CAP_CROSSBAR_INPIN_TYPE, 6);
|
|
std::cout << "Camera 0 via " << capture.getBackendName() << " backend" << std::endl;
|
|
std::cout << "Frame width: " << capture.get(CAP_PROP_FRAME_WIDTH) << std::endl;
|
|
std::cout << " height: " << capture.get(CAP_PROP_FRAME_HEIGHT) << std::endl;
|
|
std::cout << "Capturing FPS: " << capture.get(CAP_PROP_FPS) << std::endl;
|
|
|
|
const int N = 100;
|
|
Mat frame;
|
|
int64 time0 = cv::getTickCount();
|
|
for (int i = 0; i < N; i++)
|
|
{
|
|
SCOPED_TRACE(cv::format("frame=%d", i));
|
|
|
|
capture >> frame;
|
|
ASSERT_FALSE(frame.empty());
|
|
|
|
EXPECT_GT(cvtest::norm(frame, NORM_INF), 0) << "Complete black image has been received";
|
|
}
|
|
int64 time1 = cv::getTickCount();
|
|
printf("Processed %d frames on %.2f FPS\n", N, (N * cv::getTickFrequency()) / (time1 - time0 + 1));
|
|
|
|
capture.release();
|
|
}
|
|
|
|
}} // namespace
|