本帖最后由 0x4C 于 2024-2-20 14:05 编辑
看官方教程提供了opencv-mobile的使用,简单易用,浅尝一下
官方教程: opencv-mobile | LUCKFOX WIKI
1、基本测试
创建一个文件夹
mkdir opencvMobile
cd opencvMobile/
下载并解压包,放到创建的文件夹下面
在文件夹下创建新的文件 vi CMakeLists.txt 添加内容,将 <SDK Directory> 修改为自己的 SDK 路径,如 /home/luckfox/luckfox-pico/
project(opencv-mobile-test)
cmake_minimum_required(VERSION 3.5)
set(CMAKE_CXX_STANDARD 11)
SET(CMAKE_C_COMPILER "<SDK Directory>/tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf/bin/arm-rockchip830-linux-uclibcgnueabihf-gcc")
SET(CMAKE_CXX_COMPILER "<SDK Directory>/tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf/bin/arm-rockchip830-linux-uclibcgnueabihf-g++")
set(OpenCV_DIR "${CMAKE_CURRENT_SOURCE_DIR}/opencv-mobile-4.8.1-luckfox-pico/lib/cmake/opencv4")
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
add_executable(opencv-mobile-test main.cpp)
target_link_libraries(opencv-mobile-test ${OpenCV_LIBS})
创建main vi main.cpp
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <unistd.h> // sleep()
int main()
{
cv::VideoCapture cap;
cap.set(cv::CAP_PROP_FRAME_WIDTH, 320);
cap.set(cv::CAP_PROP_FRAME_HEIGHT, 240);
cap.open(0);
const int w = cap.get(cv::CAP_PROP_FRAME_WIDTH);
const int h = cap.get(cv::CAP_PROP_FRAME_HEIGHT);
fprintf(stderr, "%d x %d\n", w, h);
cv::Mat bgr[9];
for (int i = 0; i < 9; i++)
{
cap >> bgr[i];
sleep(1);
}
cap.release();
// combine into big image
{
cv::Mat out(h * 3, w * 3, CV_8UC3);
bgr[0].copyTo(out(cv::Rect(0, 0, w, h)));
bgr[1].copyTo(out(cv::Rect(w, 0, w, h)));
bgr[2].copyTo(out(cv::Rect(w * 2, 0, w, h)));
bgr[3].copyTo(out(cv::Rect(0, h, w, h)));
bgr[4].copyTo(out(cv::Rect(w, h, w, h)));
bgr[5].copyTo(out(cv::Rect(w * 2, h, w, h)));
bgr[6].copyTo(out(cv::Rect(0, h * 2, w, h)));
bgr[7].copyTo(out(cv::Rect(w, h * 2, w, h)));
bgr[8].copyTo(out(cv::Rect(w * 2, h * 2, w, h)));
cv::imwrite("out.jpg", out);
}
return 0;
}
编译
mkdir build
cd build
cmake ..
make
文件夹结构:
在build下就生成了可执行程序
将整个文件夹复制到开发板的root路径下
执行 ./opencv-mobile-test
得到图像
2、opencv4.9支持
github上已经更新到opencv4.9了,浅尝一下区别 nihui/opencv-mobile: The minimal opencv for Android, iOS, ARM Linux, Windows, Linux, MacOS, WebAssembly (github.com)
下载对应的包
解压后也放到刚才的文件夹下,删除build文件夹
修改camkelists.txt
其余步骤相同
使用的做设备 luckfox-pico max + sc3336
4.8.1下的输出
# ./opencv-mobile-test
this device is not whitelisted for jpeg decoder cvi
this device is not whitelisted for jpeg decoder cvi
this device is not whitelisted for jpeg decoder cvi
[ 430.140795] stream_cif_mipi_id0: s_power 1, entity use_count 1
devpath = /dev/video11
driver = rkisp_v7
card = rkisp_mainpath
bus_info = platform:rkisp-vir0
version = 20000
capabilities = 84201000
device_caps = 4201000
fmt = UYVY 4:2:2 59565955
fmt = Y/CbCr 4:2:2 3631564e
fmt = Y/CrCb 4:2:2 3136564e
fmt = Y/CrCb 4:2:0 3132564e
size = 32 x 16 ~ 2304 x 1296 (+8 +8)
fmt = Y/CbCr 4:2:0 3231564e
fmt = Y/CrCb 4:2:0 (N-C) 31324d4e
fmt = Y/CbCr 4:2:0 (N-C) 32314d4e
rkaiq log level ff0
[ 430.324185] stream_cif_mipi_id0: open video, entity use_countt 2
[ 430.324391] stream_cif_mipi_id1: open video, entity use_countt 1
/dev/video11 does not support changing fps
rga_api version 1.9.1_[0]
[ 430.338940] rkisp rkisp-vir0: first params buf queue
[ 430.341360] rkisp_hw ffa00000.rkisp: set isp clk = 198000000Hz
[ 430.341486] rkcif-mipi-lvds: sditf_reinit_mode, mode->rdbk_mode 0, mode->name rkisp-vir0, link_mode 1
[ 430.343320] rkcif-mipi-lvds: stream320 x 240
[0] start streaming
[ 430.343452] rockchip-mipi-csi2 ffa20000.mipi-csi2: stream on, src_sd: baffe55e, sd_name:rockchip-csi2-dphy0
[ 430.343466] rockchip-mipi-csi2 ffa20000.mipi-csi2: stream ON
[ 430.343542] rockchip-csi2-dphy0: dphy0, data_rate_mbps 506
[ 430.343574] rockchip-csi2-dphy csi2-dphy0: csi2_dphy_s_stream stream on:1, dphy0
[ 430.343587] rockchip-csi2-dphy csi2-dphy0: csi2_dphy_s_stream stream on:1, dphy0
[ 439.456220] rkcif-mipi-lvds: stream[0] start stopping, total mode 0x2, cur 0x2
[ 439.478307] rockchip-mipi-csi2 ffa20000.mipi-csi2: stream off, src_sd: baffe55e, sd_name:rockchip-csi2-dphy0
[ 439.478359] rockchip-mipi-csi2 ffa20000.mMessageParser process loop exit!
ipi-csi2: stream OFF
[ 439.480935] rockchip-csi2-dphy csi2-dphy0: csi2_dphy_s_stream_stop stream stop, dphy0
[ 439.480973] rockchip-csi2-dphy csi2-dphy0: csi2_dphy_s_stream stream on:0, dpmpp[645]: mpp_buffer: mpi_buf_id = 136, dma_buf_fd = 5
mpp[645]: mpp: mClinetFd 7 open ok attr.chan_id 0
[ 439.481019] rockchip-csi2-dphy csi2-dphy0: csi2_dphy_s_stream stream on:0, dphy0
[ 439.481238] rkcif-mipi-lvds: stream[0] stopping finished, dma_en 0x0
[ 439.496563] stream_cif_mipi_id1: close video, entity use_count#
# 0
[ 439.496651] stream_cif_mipi_id0: close video, entity use_count 1
[ 439.497314] stream_cif_mipi_id0: s_power 0, entity use_count 0
[ 439.516121] mpp_vcodec: 44: num_chan = 0
[ 439.516219] mpp_vcodec: 103: chan_entry->handle 65722eb9, enc 65722eb9
[ 439.516826] 755: MPP_ENC_SET_CFG in
[ 439.516855] 524: MPP_ENC_SET_RC_CFG bps 0 [0 : 0] fps [1:1] gop 1
4.9.0的输出
# ./opencv-mobile-test
this device is not whitelisted for jpeg decoder cvi
this device is not whitelisted for jpeg decoder cvi
this device is not whitelisted for jpeg decoder cvi
this device is not whitelisted for capture cvi
this device is not whitelisted for capture cvi
this device is not whitelisted for capture cvi
this device is not whitelisted for capture cvi
this device is not whitelisted for capture cvi
this device is not whitelisted for capture cvi
this device is not whitelisted for capture cvi
this device is not whitelisted for capture v4l2 awispapi
[ 1681.086395] stream_cif_mipi_id0: s_power 1, entity use_count 1
devpath = /dev/video11
driver = rkisp_v7
card = rkisp_mainpath
bus_info = platform:rkisp-vir0
version = 20000
capabilities = 84201000
device_caps = 4201000
fmt = UYVY 4:2:2 59565955
fmt = Y/CbCr 4:2:2 3631564e
fmt = Y/CrCb 4:2:2 3136564e
fmt = Y/CrCb 4:2:0 3132564e
size = 32 x 16 ~ 2304 x 1296 (+8 +8)
fmt = Y/CbCr 4:2:0 3231564e
fmt = Y/CrCb 4:2:0 (N-C) 31324d4e
fmt = Y/CbCr 4:2:0 (N-C) 32314d4e
rkaiq log level ff0
[ 1681.269800] stream_cif_mipi_id0: open video, entity use_countt 2
[ 1681.270001] stream_cif_mipi_id1: open video, entity use_countt 1
/dev/video11 does not support changing fps
rga_api version 1.9.1_[0]
[ 1681.284710] rkisp rkisp-vir0: first params buf queue
[ 1681.287253] rkisp_hw ffa00000.rkisp: set isp clk = 198000000Hz
[ 1681.287302] rkcif-mipi-lvds: sditf_reinit_mode, mode->rdbk_mode 0, mode->name rkisp-vir0, link_mode 1
[ 1681.289425] rkcif-mipi-lvds: stream[0] start st320 x 240
reaming
[ 1681.289596] rockchip-mipi-csi2 ffa20000.mipi-csi2: stream on, src_sd: baffe55e, sd_name:rockchip-csi2-dphy0
[ 1681.289611] rockchip-mipi-csi2 ffa20000.mipi-csi2: stream ON
[ 1681.289661] rockchip-csi2-dphy0: dphy0, data_rate_mbps 506
[ 1681.289691] rockchip-csi2-dphy csi2-dphy0: csi2_dphy_s_stream stream on:1, dphy0
[ 1681.289703] rockchip-csi2-dphy csi2-dphy0: csi2_dphy_s_stream stream on:1, dphy0
[ 1690.398035] rkcif-mipi-lvds: stream[0] start stopping, total mode 0x2, cur 0x2
[ 1690.424739] rockchip-mipi-csi2 ffa20000.mipi-csi2: stream off, src_sd: baffe55e, sd_name:rockchip-csi2-dphy0
[ 1690.424791] rockchip-mipi-MessageParser process loop exit!
csi2 ffa20000.mipi-csi2: stream OFF
[ 1690.427185] rockchip-csi2-dphy csi2-dphy0: csi2_dphy_s_stream_stop stream stop, dphy0
[ 1690.427235] rockchip-csi2-dphy csi2-dphmpp[740]: mpp_buffer: mpi_buf_id = 136, dma_buf_fd = 5
ympp[740]: mpp: mClinetFd 7 open ok attr.chan_id 0
0: csi2_dphy_s_stream stream on:0, dphy0
[ 1690.427297] rockchip-csi2-dphy csi2-dphy0: csi2_dphy_s_stream stream on:0ioctl IOCTL_FREE_IOMMU_ADDR failed 9 Bad file descriptor
ioctl ION_IOC_FREE failed 9 Bad file descriptor
, dphy0
[ 1690.427546] rkcif# -mipi-lvds: stream[0] stopping finished, dma_en 0x0
[ 1690.439913] stream_cif_mipi_id1: close video, entity use_count 0
[ 1690.440016] stream_cif_mipi_id0: close video, entity use_count 1
[ 1690.440679] stream_cif_mipi_id0: s_power 0, entity use_count 0
[ 1690.459025] mpp_vcodec: 44: num_chan = 0
[ 1690.459126] mpp_vcodec: 103: chan_entry->handle 68c79227, enc 68c79227
[ 1690.459735] 755: MPP_ENC_SET_CFG in
[ 1690.459764] 524: MPP_ENC_SET_RC_CFG bps 0 [0 : 0] fps [1:1] gop 1
3、寻找最大色块
#include <iostream>
#include <vector> // 添加 vector 头文件
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
int main()
{
Mat image = imread("test.jpg"); // 替换为您的图像路径
Mat hsvImage;
cvtColor(image, hsvImage, COLOR_BGR2HSV);
// 定义红色范围
Scalar lowerRed = Scalar(0, 100, 100);
Scalar upperRed = Scalar(10, 255, 255);
// 提取红色物体
Mat redMask;
inRange(hsvImage, lowerRed, upperRed, redMask);
// 查找红色物体的轮廓
std::vector<std::vector<Point>> contours;
findContours(redMask, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
// 绘制红色物体的轮廓并计算中心坐标
for (const auto& contour : contours)
{
drawContours(image, std::vector<std::vector<Point>>{contour}, -1, Scalar(0, 0, 255), 2);
// 计算轮廓的中心坐标
Moments mu = moments(contour, false);
Point2f center = Point2f(mu.m10 / mu.m00, mu.m01 / mu.m00);
// 在图像上绘制中心坐标
circle(image, center, 5, Scalar(255, 255, 255), -1);
// 输出中心坐标
std::cout << "Red object center coordinates: (" << center.x << ", " << center.y << ")" << std::endl;
}
// 显示结果
imshow("Red Objects", image);
waitKey(0);
return 0;
}
将测试图片放到和程序同一路径下,执行 ./opencv-mobile-test
输出结果:
# ./opencv-mobile-test
this device is not whitelisted for jpeg decoder cvi
this device is not whitelisted for jpeg decoder cvi
this device is not whitelisted for jpeg decoder cvi
Red object center coordinates: (nan, nan)
Red object center coordinates: (nan, nan)
Red object center coordinates: (245.15, 156.34)
imshow save image to Red Objects.pngwaitKey stub#