works
import cv2
import gi
gi.require_version('Gst', '1.0')
from gi.repository import Gst
def read_cam():
cap = cv2.VideoCapture("nvarguscamerasrc ! video/x-raw(memory:NVMM), width=(int)1920, height=(int)1080,format=(string)NV12, framerate=(fraction)30/1 ! nvvidconv ! video/x-raw, format=(string)BGRx ! videoconvert ! video/x-raw, format=(string)BGR ! appsink")
if cap.isOpened():
cv2.namedWindow("demo", cv2.WINDOW_AUTOSIZE)
while True:
ret_val, img = cap.read();
cv2.imshow('demo',img)
if cv2.waitKey(1) == ord('q'):
break
else:
print ("camera open failed")
cv2.destroyAllWindows()
if __name__ == '__main__':
print(cv2.getBuildInformation())
Gst.debug_set_active(True)
Gst.debug_set_default_threshold(0)
read_cam()
credits to @Honey_Patouceul code which works with the latest Jetpack 4.4 with the latest opencv 4.3.
#include <iostream>
#include <signal.h>
#include <opencv2/opencv.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/highgui.hpp>
static cv::VideoCapture *capPtr=NULL;
void my_handler(int s){
printf("Caught signal %d\n",s);
if(capPtr)
capPtr->release();
exit(1);
}
int main()
{
/* Install handler for catching Ctrl-C and close camera so that Argus keeps ok */
struct sigaction sigIntHandler;
sigIntHandler.sa_handler = my_handler;
sigemptyset(&sigIntHandler.sa_mask);
sigIntHandler.sa_flags = 0;
sigaction(SIGINT, &sigIntHandler, NULL);
const char* gst = "nvarguscamerasrc ! video/x-raw(memory:NVMM), width=640, height=480 ! nvvidconv ! video/x-raw,format=I420 ! appsink";
capPtr = new cv::VideoCapture(gst, cv::CAP_GSTREAMER);
if(!capPtr->isOpened()) {
std::cout<<"Failed to open camera."<<std::endl;
return (-1);
}
cv::namedWindow("MyCameraPreview", cv::WINDOW_AUTOSIZE);
cv::Mat frame_in;
while(1)
{
if (!capPtr->read(frame_in)) {
std::cout<<"Capture read error"<<std::endl;
break;
}
else {
cv::cvtColor(frame_in, frame_in, cv::COLOR_YUV2BGR_I420);
cv::imshow("MyCameraPreview",frame_in);
if((char)cv::waitKey(1) == (char)27)
break;
}
}
capPtr->release();
delete capPtr;
return 0;
}
can be compiled e.g. with
g++ -std=c++11 -Wall -I/usr/include/opencv4/ -I/usr/local/cuda/targets/aarch64-linux/include simple_video.cpp -L/usr/lib -lopencv_core -lopencv_imgproc -lopencv_video -lopencv_videoio -lopencv_highgui -o simple_video